Java通信协议——UDP通信协议,模拟聊天室(完整详解,附有代码)
UDP通信协议,模拟聊天室
需求说明
实现客户咨询问题,客服人员答复问题
分析
咨询时,客户是发送方,客服人员是接收方
答复时,客服人员是发送方,客户是接收方,实现思路和咨询时相同
当客户端输入 ending 时 会话结束。
运行时,先运行接收端,再运行发送端。
效果图:
接收端:
public class ReceiveMessTest {
public static void main(String[] args) throws IOException {
// UDP多次接收 多次发送
// 接收端模拟TCP协议的服务器端
System.out.println("---服务端---");
// 1.创建接收端的DatagramSocket对象,
DatagramSocket ds = null;
DatagramPacket dp = null;
Scanner sc = new Scanner(System.in);
// 1.创建接收端的DatagramSocket对象,
ds = new DatagramSocket(10011);
//循环实现多次接收
while (true){
// 2.创建接收数据的数据包
// 重新打包数据
byte[] bytes = new byte[1024];
dp = new DatagramPacket(bytes,bytes.length);
// 3.接收数据
ds.receive(dp);
// 4.解析数据包
byte[] data = dp.getData();
// 打印数据
String msg = new String(data);
System.out.println("客户端:"+msg);
// -----------------------------------------------------
// 发送
System.out.print("服务端请输入:");
String s = sc.nextLine();
// 获得上个数据包发送的地址
// InetAddress address = dp.getAddress();
SocketAddress address = dp.getSocketAddress();
// 打包数据
dp = new DatagramPacket(
s.getBytes(),
s.getBytes().length,
address
);
// 发送数据
ds.send(dp);
}
}
}
发送端:
public class SendMessTest {
public static void main(String[] args) throws IOException {
// UDP多次发送 多次接收
//发送端模拟TCP协议的客户端
System.out.println("----客户端----");
// 1.创建发端的对象
DatagramSocket ds = null;
DatagramPacket dp = null;
// 2.打包数据
// 2.1数据来自键盘录入
Scanner sc = new Scanner(System.in);
while (true){
// 1.创建发端的对象
ds = new DatagramSocket();
System.out.print("请输入要发送的数据:");
String s = sc.nextLine();
// 结束发送的条件
if ("ending".equals(s)){
break;
}
// 2.2将发送的内容变成字节数组
byte[] bytes = s.getBytes();
// 2.3向127.0.0.1的设备发送
InetAddress address = InetAddress.getByName("127.0.0.1");
// 2.4接收设备的端口号
int port = 10011;
// 2.5 打包数据
dp = new DatagramPacket(bytes,bytes.length,address,port);
// 3.发送数据
ds.send(dp);
// ----------------------------------------
// 4.接收数据
// 创建一个新的数组,用来接收数据
byte[] bytes1 = new byte[1024];
// 创建数据包
dp = new DatagramPacket(bytes1,bytes1.length);
// 接收数据
ds.receive(dp);
// 解析数据
byte[] data = dp.getData();
String s1 = new String(data);
System.out.println("服务端:"+s1);
}
// 4.释放资源
ds.close();
}
}