Java 发送数据报数据包时,数据包的数据被复制。(爪哇)
UDP客户端:Java 发送数据报数据包时,数据包的数据被复制。(爪哇),java,udp,buffer,packet,datagram,Java,Udp,Buffer,Packet,Datagram,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;
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)
UDPserver:
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
怎么了?如何清理缓冲区?在服务器代码中,相同的缓冲区可用于所有接收的数据包(这是一件好事)。然而,这意味着来自先前数据包的数据在被覆盖之前一直存在于缓冲区中。如您所见,当您收到一个比前一个短的数据包时,只有缓冲区中的第一个字节被覆盖,直到收到的消息的长度为止
newstring(packet.getData())
让字符串构造函数通过查看缓冲区的内容来计算数据的长度。相反,使用它可以指定数据的长度:新字符串(packet.getData(),0,packet.getLength())
您无法从服务器端清除缓冲区,因为所有连接都使用相同的缓冲区。但是,您可以使用packet.getLength()
和packet.getOffset()
来检查接收数据的长度和偏移量
String received
= new String(packet.getData(), packet.getOffset(), packet.getLength());
在客户端中,调用
buffer.length
时,buffer
仍然为空,这将引发NPE。我想缺少一些代码?我移动了packet=newdatagrampacket(buffer,buffer.length,InetAddress.getByName(serverIP),serverPORT)
到buffer=str.getBytes()的底部代码>我理解并成功了。非常感谢。顺便说一句当客户端收到“退出”字符串时,如何检测“退出”字符串?我添加了if(text.equals(“exit”){System.out.println(“exit”)break;}
但在语句仍在循环时什么也没有发生。@H.Bin问题是,当用户在客户端输入“exit”时,客户端会立即退出,而不向服务器发送字符串。要解决这个问题,可以将if(str.equals(“exit”){System.out.println(“exit”);break;}
块放在客户端while循环的末尾