java - 对于分片到达的 UDP 数据包该怎么办

标签 java sockets udp datagram

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

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 数据报完好无损地到达,或者根本没有到达。服务器必须以两个数据报的形式发送数据。

关于java - 对于分片到达的 UDP 数据包该怎么办,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21941062/

相关文章:

java - 使用 REST Web 服务就修改情况与 2 个应用程序进行通信

java - 使用 Java 过滤器从子域中删除基本域 cookie

python - 提高多线程 Web 服务器的性能

java - 如何确认数据报包源地址?

sockets - 使用 TUN/TAP 读取传入的数据,封装为 UDP 并传输

java - 重复使用 Selenium 元素定位器的最佳方法是什么?

java - 编译时的原始变量类型

C# SSL 安全套接字

Java Socket OutputStream 未刷新

c++ - 通过从 C++ 到 nodejs 进程的套接字连接发送 250ms UDP 价格滴答,为什么?