本篇文章是再UDP发消息的升级版,UDP聊天
一个Demo01负责消息发送,Demo02负责接收消息
消息发送方
- 建立一个socket
- 准备数据,从控制台读取数据
(1)建立缓冲输入流
(2)建立循环发送消息,已经终止循环的条件 - 释放资源
package Udp聊天;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdpSenderDemo01 {
public static void main(String[] args) throws IOException {
//1.建立一个socket
DatagramSocket socket = new DatagramSocket(8888);
//2.准备数据:从控制台读取
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true){
String data= reader.readLine();
byte[] data2=data.getBytes();
//发送什么数据,数据开始位置到结束位置,发送数据的地址和端口号
DatagramPacket packet = new DatagramPacket(data2, 0, data2.length, new InetSocketAddress("localhost", 6666));
//3.发送数据
socket.send(packet);
if(data.equals("bye"))
break;
}
//4.释放资源
socket.close();
}
}
消息接收方
- 建立一个socket
- 循环接收数据模块设计,以及终止循环的条件
- 释放资源
package Udp聊天;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiveDemo02 {
public static void main(String[] args) throws IOException {
//
DatagramSocket socket = new DatagramSocket(6666);
while (true){
//接收数据
byte[] buffer=new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//阻塞式接收数据
socket.receive(packet);
byte[] data=packet.getData();
String receiveData=new String(data,0, packet.getLength());
/*
关于这里使用data.Length,不能结束的原因:
data.Length=packet.getData().Length 那么出来的receiveData长度不是“bye”字符长度
所以这里,直接用packet
发送端发送bye
System.out.println(packet.getLength());结果是3
System.out.println(data.length);结果是1024
*/
//System.out.println(packet.getLength());9/3
//System.out.println(data.length);1024/1024
System.out.println(receiveData);
//需要设置断开点解的条件
if(receiveData.equals("bye"))
break;
}
socket.close();
}
}
接收端遇到的坑
关于UDP Packet通信,里面getData()有一个坑
情况描述:
解决方案:
将String receiveData=new String(data,0, data.Length)
改为String receiveData=new String(data,0, packet.getLength())
分析研究
DatagramPacket的两个方法getData()和getLength()是不对应的。getLength()反映了刚刚接收到的数据的长度,而getData()反映了DatagramPacket对应缓冲区中的新接收到的数据和未被覆盖的旧数据,当我们使用DatagramPacket来处理新接收到的数据时,就容易同时触及到旧数据导致混乱。
发送端发送:
你好啊
bye
接收端:
System.out.println(packet.getLength());输出9/3
System.out.println(data.length);输出1024/1024
因为我们第一开始定义的数组长度是1024
https://blog.csdn.net/xiaohaier8593/article/details/90338770,深入探究可查看此文章