收到不完整的UDP数据包

时间:2012-08-08 16:45:38

标签: java android sockets udp datagram

我在Android中使用UDP接收数据时遇到了一个非常奇怪的问题。 我正在编写一个应用程序来控制Android设备的wifi模块。我能够成功地将数据发送到这个远程wifi设备。但是我无法从这个wifi设备接收到“完整”的数据包。

我在android中的代码是:

public static void receivePacket(int receiverPort, Context context) {
    DatagramSocket socket = null;
    String text = "";
    try {           
        byte[] message = new byte[1500];
        DatagramPacket packet = new DatagramPacket(message, message.length);
        socket = new DatagramSocket(receiverPort);          
        //socket.setSoTimeout(5000);
        for (int i = 0; i < 12; i++) {
            socket.receive(packet);
            text += new String(message, 0, packet.getLength()) + "\n";
        }
        socket.close();
        Log.d("Received Message", text);
    } catch (Exception e) {
        Log.e("UDP", "S: Error", e);
    } finally {
        if(null != socket){
            socket.close();
        }
    }
}

所以,如果我期待数据“$ BEG1; $ PID2; $ PIP192.168.15.245; $ PPN80; $ DAT987654321; $ END1;”我只得到“$ BEG1; $ PID2; $ PIP192.168.15.245; $ PPN80; $ DAT98”

我尝试使用UDP WinChat应用程序来查看它是否能够从wifi模块获取消息并且我能够获取整个数据。

此外,如果我尝试使用UDP Win Chat应用程序向Android设备发送一条很长的消息,我就能获得整个数据!

我完全糊涂了!请帮助。


我能够找出问题所在。 (虽然还没有找到修复:(...)

从上面的代码我开始使用相同的packet.getLength()进行每次迭代,假设它每次都会根据收到的数据进行更改。但遗憾的是,这不是预期的行为。 getLength()使用前一个值并截断新到达的消息。 [请注意:这是随机行为,不会一直发生]

现在问题是,每当我在循环中收到新消息时,如何更改或刷新此属性?

1 个答案:

答案 0 :(得分:4)

您需要在每次接收之前重置DatagramPacket长度。否则它会缩小到目前为止收到的最小数据包。