在实现Java聊天室之前,我们先了解一下什么是UDP协议,以及使用UDP协议的客户端或服务器端是如何来接收信息或者发送信息的。

UPD(User Datagram Protocol)用户数据报协议,是网络模型中的传输层协议。UDP协议是无连接、不可靠的,并且它是面向报文的,并不是像TCP一样,面向字节流的。UDP没有拥塞控制,适合媒体通信。

在Java.net报中,也提供了两个类DatagramSocket和DatagramPacket来支持UDP的数据报通信。DatagramSocket是用于在程序之间建立传输的通信通道,并且它发送的每个包都需要指定地址。而DatagramPacket是用来表示一个数据包的,DatagramPacket只是在首次创建时指定地址,以后所有的包都会通过DatagramSocket发送。

UDP编程分为四个部分:建立连接,发送数据,接收数据,关闭连接。

1、在服务器端:使用UDP来监听指定端口。代码如下:

DatagramSocket ds = new DatagramSocket(6666); // 监听指定端口
while (true) { // 无限循环// 数据缓冲区:byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);ds.receive(packet); // 收取一个UDP数据包// 收取到的数据存储在buffer中,由packet.getOffset(), packet.getLength()指定起始位置和长度// 将其按UTF-8编码转换为String:String s = new String(packet.getData(), packet.getOffset(), packet.getLength(), StandardCharsets.UTF_8);// 发送数据:byte[] data = "ACK".getBytes(StandardCharsets.UTF_8);packet.setData(data);ds.send(packet);
}

2、服务器首先使用如下语句在指定端口监听UDP数据包:

// 监听6666端口
DatagramSocket ds = new DatagramSocket(6666);

3、 要接收一个数据包,需要准备一个byte[] 类型数组缓冲区,并通过DatagramPacket实现接收:

byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
ds.receive(packet);

4、如果我们收到的是String类型,则通过DatagramPacket返回的packet.getOfferset()和packet.getLength()确定数据在缓冲区的起止位置:

String s = new String(packet.getData(), packet.getOffset(), packet.getLength(), StandardCharsets.UTF_8);

5、当服务器收到一个UDP数据包后,通常会立刻回复一个UDP包:

byte[] data = ...
packet.setData(data);
ds.send(packet);

6、 而在客户端,只需要直接使用socket发送一个数据包,等待服务器响应一个数据包即可:

DatagramSocket ds = new DatagramSocket();
ds.setSoTimeout(1000);
ds.connect(InetAddress.getByName("localhost"), 6666); // 连接指定服务器和端口// 发送:
byte[] data = "Hello".getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length);
ds.send(packet);// 接收:
byte[] buffer = new byte[1024];
packet = new DatagramPacket(buffer, buffer.length);
ds.receive(packet);
String resp = new String(packet.getData(), packet.getOffset(), packet.getLength());
ds.disconnect();

7、客户端打开一个socket:

DatagramSocket ds = new DatagramSocket();
ds.setSoTimeout(1000);
ds.connect(InetAddress.getByName("localhost"), 6666);

8、客户端实例时候,不需要指定端口,操作系统会指定一个当前未使用的端口,然后调用setSoTime(3000),设定超时时间。如果超时没有收到数据包,则会自动断开与当前服务器的连接。

9、如果客户端认为通信结束了,就可以调用disconnect()断开连接。disconnect()方法只是清楚了发送到服务器端的IP和端口。以便于socket连接下一台服务器。



下面展示基于UDP协议的Java聊天室:

代码展示(服务器端 or 客户端1):

package com.apesource;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;import javax.xml.crypto.Data;public class ChatA {public static void main(String[] args) {// 控制台上输入Scanner scan = new Scanner(System.in);// 创建DatagramSocket的对象,自身端口为1097try (DatagramSocket socket = new DatagramSocket(1097)) {// 创建DatagramPacket对象,同时监控客户端8888端口DatagramPacket sendPacket = new DatagramPacket(new byte[1024], 1024,new InetSocketAddress("192.168.254.146", 8888));DatagramPacket receivePacket = new DatagramPacket(new byte[1024],1024);while(true) {// 发送System.out.print("服务器端说:");   String str = scan.nextLine();if(str.equals("退出聊天")) {String res = "对方已经退出聊天室!";byte[] sendContent = res.getBytes();sendPacket.setData(sendContent);socket.send(sendPacket);break;}// 接收socket.receive(receivePacket);String receiveContent = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());System.out.print("客户端说:" + receiveContent);System.out.println();}} catch (SocketException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

代码展示(服务器端 or 客户端2):

package com.apesource;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Scanner;public class ChatB {public static void main(String[] args) {Scanner scan = new Scanner(System.in);// 自身端口8888try (DatagramSocket socket = new DatagramSocket(8888)) {DatagramPacket sendPacket = new DatagramPacket(new byte[1024], 1024,new InetSocketAddress("192.168.254.146", 1097));DatagramPacket receivePacket = new DatagramPacket(new byte[1024],1024);while(true) {// 接收socket.receive(receivePacket);String receiveContent = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());System.out.print("服务器端说:" + receiveContent);System.out.println();// 发送System.out.print("客户端说:");String str = scan.nextLine();if(str.equals("退出聊天")) {String res = "对方已退出聊天室!";byte[] sendContent = res.getBytes();sendPacket.setData(sendContent);socket.send(sendPacket);break;}byte[] sendContent = str.getBytes();sendPacket.setData(sendContent);socket.send(sendPacket);}} catch (SocketException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

基于UDP协议的Java聊天室相关推荐

  1. 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)

    作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...

  2. 【Linux网络编程】基于UDP实现多人聊天室

    文章目录 一.UDP的概念 1.1 UDP 1.2 UDP特点 二. 采用UDP实现多人聊天室原因 三.多人聊天室项目功能 四.实现多人聊天室项目流程分析 4.1 前期准备 4.1.1 定义结构体 4 ...

  3. 基于TCP协议的网络聊天室

    创建服务端程序 public class Server {public static void main(String[] args) {new Thread(new ServerTask()).st ...

  4. 网络编程应用:基于UDP协议【实现聊天程序】--练习

    要求: 使用UDP协议实现一个聊天程序 代码: 发送端: package UDP聊天程序;import java.io.IOException; import java.net.DatagramPac ...

  5. 基于 python 和 UDP 协议实现简易聊天室(多人群聊)----详细解析带字幕

    聊天室项目 功能介绍: 1.进入聊天室:输入姓名,用户名(不能重复) 2.某个成员进入聊天室后给其他所有所有成员发送消息 3.任何一个人发消息,其他人都会收到 4.某人退出聊天室,其他成员也会收到通知 ...

  6. 基于udp的多人聊天室

    服务端 相当于一个服务器,接收用户发送的过来的消息(登录消息,文本消息,退出登录消息),然后将其转发给其用户. 基本功能: 1.把新注册用户登陆消息告诉其它用户 2.把新用户插入到用户链表中 3.服务 ...

  7. Golang实现基于Websocket协议的H5聊天室

    http://www.cnblogs.com/wangrudong003/p/5535689.html 关注公众号 风色年代(itfantasycc) 300G Golang微服务资料等你拿! go代 ...

  8. java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些java方面的技术应用. 今天没什么事做,基于udp协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对java网络编程方面的一个简单回忆. ...

  9. java udp 聊天室_Java基于UDP协议实现简单的聊天室程序

    最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. ...

  10. Java网络编程——基于UDP协议的聊天室

    UDP简述    UDP(User Datagram Protocol)协议是Internet 协议集支持的一个无连接的传输协议,中文名为用户数据报协议.它为应用程序提供了一种无需建立连接就可以发送封 ...

最新文章

  1. _Linux 的文件系统及文件缓存知识点整理
  2. 停止使用p = 0.05
  3. 信息学奥赛一本通 1005:地球人口承载力估计| OpenJudge NOI 小学奥数 7653
  4. 跟我一起学Angular2(1)-了解ng模块化
  5. 《Solution-Centric Organization》解决方案导向型组织 节选 IV
  6. Kubernetes详解(二十七)——Deployment控制器回滚
  7. 21世纪将淘汰的八种人
  8. matlab二阶系统设置参数,一阶和二阶系统响应的matlab制作
  9. 服装店商家不离手的十大服装进销存管理软件,快来看看吧
  10. Linux编程基础 5.2:消息队列
  11. 交换机的作用是什么?交换机功能及工作原理详解!
  12. Apple官方对于Http Live Streaming的常见问题回答
  13. 1945-计算弹跳高度
  14. 湖南生物机电职院信息技术学院召开第一届思政工作会议
  15. 断点续传(视频进度条拖动以及flv.js需要断点续传)
  16. 计算机导论中逻辑与或非的公式,12.函数与公式之逻辑函数(or,and,not,if)
  17. Yii Framework 开发教程(32) Zii组件-GridView示例
  18. 最佳平方逼近 matlab,matlab最佳平方逼近
  19. 那个“炫酷狂拽”的数据可视化利器AntV 11.22版全新发布啦
  20. (转)Openbravo ERP架构分析

热门文章

  1. android 头像修改
  2. EXCEL等额本息还款计算器
  3. 信息系统管理师备考指南
  4. python deap_python 的 DEAP框架学习
  5. 网易云播放器外链插入html,Wordpress网易云外链音乐播放调用
  6. 项目过程管理(五)需求文档
  7. MCSA Server 2012 R2 Passthrough Disk
  8. 何为线性时不变系统!详解
  9. ROS中使用A星算法进行路径规划
  10. LNMP一键安装脚本(执行后只需等待即可)