本篇文章是再UDP发消息的升级版,UDP聊天
一个Demo01负责消息发送,Demo02负责接收消息
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();
}
}
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,深入探究可查看此文章