Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发送数据报数据包时,数据包的数据被复制。(爪哇)_Java_Udp_Buffer_Packet_Datagram - Fatal编程技术网

Java 发送数据报数据包时,数据包的数据被复制。(爪哇)

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;

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)
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循环的末尾