Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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_Sockets_Udp_Datagram - Fatal编程技术网

Java 如何处理以碎片形式到达的UDP数据包

Java 如何处理以碎片形式到达的UDP数据包,java,sockets,udp,datagram,Java,Sockets,Udp,Datagram,我有一个Java应用程序正在循环中接收UDP数据包: while (running) { try { // Block until a packet is received on the port byte[] buffer = new byte[1024]; DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length); serverSoc

我有一个Java应用程序正在循环中接收UDP数据包:

while (running) {
    try {
        // Block until a packet is received on the port
        byte[] buffer = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
        serverSocket.receive(receivePacket);
        ByteArrayInputStream byteIn = new ByteArrayInputStream(receivePacket.getData(), 0, receivePacket.getLength());
        DataInputStream dataIn = new DataInputStream(byteIn);

        // Print packet
        String packetString = "";
        while((packetString = dataIn.readLine()) != null) {
            Log.d("WiFi", packetString);
        }

    } catch (IOException ex) {
        Log.d("WiFi", "Problem receiving: " + ex.toString());
    }
}
当我收到数据包时,很多数据包都按预期到达,但每隔一段时间,我就会收到一个数据包,它被分成两部分:

103, -5.84, 5.64, 140.72, #A-=-22.53,-50.18,248.83,  #G-=52.00,-69.00,-18.00,   #M-=-146.66,-155.18,151.06,   2575012
103, -6.51, 5.62, 140.41, #A-=-22.53,-51.20,248.83,  #G-=23.00,44.00,-7.00,   #M-=-146.21,-156.13,151.06,   2575036
103, -7.23, 5.65, 140.09, #A-=-19.46,-49.15,243.71,  #G-=17.00,68.00,-2.00,   #M-=-144.85,-155.18,151.06,   2575063
103, -7.76, 5.60, 139.81, #A-=-17.41,-50.18,240.64,  #G-=17.00,71.00,0.00,   #M-=-143.94,-155.65,153
.47,   2575090
103, -8.51, 5.34, 139.40, #A-=-12.29,-47.10,233.47,  #G-=31.00,-1.00,-5.00,   #M-=-144.85,-154.70,151.87,   2575135
103, -9.20, 4.76, 138.95, #A-=-15.36,-50.18,239.62,  #G-=22.00,30.00,-3.00,   #M-=-146.66,-156.13,151.87,   2575200
103, -9.82, 4.46, 138.61, #A-=-15.36,-47.10,239.62,  #G-=33.00,1.00,-3.00,   #M-=-145.76,-156.13,152.27,   2575266
103, -10.38, 4.07, 138.23, #A-=-14.34,-48.13,235.52,  #G-=30.00,4.00,-7.00,   #M-=-144.85,-155.65,152.27,   2575372
103, -10.90, 3.76, 137.90, #A-=-14.34,-48.13,237.57,  #G-=29.00,19.00,-4.00,   #M-=-145.30,-156.13,151.47,   2575520
103, -11.41, 3.53, 137.44, #A-=-15.36,-48.13,235.52,  #G-=25.00,18.00,-4.00,   #M-=-146.21,-155.18,151.47,   2576917
如第4行和第5行所示,4的最后一个尾随字符已被截断,剩余字符的新数据包已到达。从我对UDP的阅读中,每个人都警告说UDP不能保证数据包的到达。就我而言,这不是问题;一个丢失的数据包,否则不会破坏我的应用程序。然而,我还没有发现任何关于包不一定完整到达的信息。事实上,我已经读到这种情况不会发生


这通常是如何处理的?我很难知道到达的数据包是否完整,我只能等待下一个数据包并附加数据。

你所描述的是不可能的。UDP数据报完好无损地到达,或者完全没有到达。服务器必须以两个数据报的形式发送数据。

由于IP级别的碎片应该在您看到数据包之前在IP堆栈中撤消,因此我怀疑服务器正在以两个数据包的形式发送数据。你最好的办法是在用Wireshark观察流量的同时复制这种情况,看看到底发生了什么。这里有足够多不同的移动部件(服务器、网络、操作系统、TCP/IP堆栈等),如果看不到线路上的网络流量,你不可能走得更远。我下载了WireShark,正在查看数据包。我以前从未使用过WireShark,现在我处于小提琴模式。看起来,一个标准数据包大约有156字节,但有时它会将这些数据包组合成一个更大的数据包(我假设操作系统正在实现某种缓冲区?当流量频繁时会发生这种情况),最多492字节。这意味着我达到了极限。通常对此做些什么?不,这是指传输层碎片。在应用层,要么整个数据包到达目的地,要么不到达目的地。UDP永远不会将多个源数据报合并到一个IP数据包中。您必须将Wireshark跟踪与调试输出相匹配,并重新创建条件以查看发送的内容。注意IP碎片标志;Wireshark会告诉你什么时候检测到碎片。在做了一些挖掘之后,发现我用来发送UDP数据包的芯片(WiFly Rn Xv)会自动将数据捆绑到更大的数据包中,然后在更大的数据包变大时分裂成多个数据包。我想这样做是为了减少开销。我通过在字符串的开头添加一个特殊字符,在字符串的结尾添加一个特殊字符来解决我的问题,这样我就可以检查数据包是否包含完整的数据量。如果没有,我可以在上面附加一个新包。