1

我在 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() 使用先前的值并截断新到达的消息。[请注意:这是一种随机行为,不会一直发生]

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

4

1 回答 1

4

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

于 2012-08-08T23:49:54.837 回答