UDP客户端:
public static void main(String[] args) {
// TODO Auto-generated method stub
DatagramSocket socket;
DatagramPacket packet;
String str = "";
byte[] buffer;
String serverIP = "192.168.0.16";
int serverPORT = 10789;
Scanner sc = new Scanner(System.in);
try {
socket = new DatagramSocket();
while(true) {
System.out.print("To server : ");
str = sc.nextLine();
if(str.equals("exit")) {
System.out.println("exit");
break;
}
buffer = str.getBytes();
packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(serverIP), serverPORT);
socket.send(packet);
System.out.println("sent message : " + str);
}
socket.close();
} catch (skip)
UDP服务器:
byte[] buffer = new byte[1024];
public static void main(String[] args){
int port = 10789;
DatagramSocket socket;
DatagramPacket packet;
byte[] buffer = new byte[1024];
try {
socket = new DatagramSocket(port);
packet = new DatagramPacket(buffer, buffer.length);
while(true){
socket.receive(packet);
String text = new String(packet.getData());
if(text.equals("exit")){
System.out.println("exit");
break;
}
System.out.println("received : "+text);
}
}
当我多次输入时,数据包的数据会重复。
示例:当我打字时:
输入abcdeg
在服务器上显示abcdeg
输入qwe
在服务器上显示qwedeg
出了什么问题?如何清理缓冲区?
最佳答案
在服务器代码中,所有接收到的数据包都会重用相同的缓冲区(这是一件好事)。然而,这意味着先前数据包中的数据一直存在于缓冲区中,直到被覆盖。正如您所看到的,当您收到比前一个数据包短的数据包时,只有缓冲区中的第一个字节被覆盖,直到接收到的消息的长度。
new String(packet.getData())
让 String 构造函数通过查看缓冲区的内容来确定数据的长度。相反,使用 another constructor允许您指定数据的长度:new String(packet.getData(), 0, packet.getLength())
。
关于java - 发送数据报包时,数据包的数据是重复的。 (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49716881/