Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 UDP接收到数据包,但打印出有趣的结果_Java_Network Programming_Udp - Fatal编程技术网

Java UDP接收到数据包,但打印出有趣的结果

Java UDP接收到数据包,但打印出有趣的结果,java,network-programming,udp,Java,Network Programming,Udp,我正在做一个从发送方到接收方的简单UDP file.txt传输。它准时到达。。但是,当我打印内容时,有些内容输出正确,但有些内容与接收端接收到的之前的文字混在一起 我的意思是: 文本文件的内容全部包含在一句话中,如下所示: 日复一日,一周又一周,在我回到日内瓦的时候就去世了 例如,在接收器侧: 一天 之后 白天,r 威克 之后 威克 通过 逃避 奥奈德 迈耶德 返回 扭转 日内瓦 代码为: byte[] byteArray = new byte[9999]; Datag

我正在做一个从发送方到接收方的简单UDP file.txt传输。它准时到达。。但是,当我打印内容时,有些内容输出正确,但有些内容与接收端接收到的之前的文字混在一起

我的意思是: 文本文件的内容全部包含在一句话中,如下所示:

日复一日,一周又一周,在我回到日内瓦的时候就去世了

例如,在接收器侧:

一天 之后 白天,r 威克 之后 威克 通过 逃避 奥奈德 迈耶德 返回 扭转 日内瓦

代码为:

    byte[] byteArray = new byte[9999]; 
        DatagramSocket listenSocket = new DatagramSocket(5001, InetAddress.getByName("127.0.0.1")); 
    while(true) {   
        DatagramPacket segment = new DatagramPacket(byteArray, byteArray.length); 
        listenSocket.receive(segment); 
        ByteArrayInputStream byteIn = new ByteArrayInputStream(segment.getData()); 
        int data = byteIn.read(); 
        if(data == -1) { 
        //break; 
        } else { 
           System.out.println("Got: " + new String(segment.getData()));
        }

是的,TCP是一个更好的选择,但我需要帮助了解为什么会发生这种情况。我希望你们都能给我这个问题的见解

第一次使用缓冲区后忘记清空缓冲区-因此,如果连续接收得到的数据少于前一次,您将重新读取一些旧数据。

UDP不能保证正确的顺序和重复保护。如果你需要这个,你必须使用TCP或者自己在UDP之上实现所有这些服务。好的,在看到你的回复后,我终于让它工作了。我所做的只是将缓冲区移动到while循环中,以清除之前存储的字。虽然这解决了您的问题,但效率很低:您将过多地分配和GC它。考虑将其消隐或使用接收长度为TuntCad。这是非常正确的点。好的,我会找到这个的java方法。你试过简单地将数组的前5个字节设置为0吗?