【问题标题】:Incomplete UDP Packet received收到不完整的 UDP 数据包
【发布时间】:2012-08-05 20:13:59
【问题描述】:

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

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

【问题讨论】:

  • 你试过增加缓冲区大小吗?
  • 您是在一个数据包中发送全部数据吗?
  • @Atlos:是的,正如您从我的代码中看到的那样,我使用了 500 字节大小,而我期望的数据甚至不会超过 100!
  • @mervyn.777 这是正确的代码,但如果您将数据包分成小数据包的块并分发它们会更好。
  • @mervyn.777 请写数据包发送方代码

标签: java android sockets udp datagram


【解决方案1】:

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

【讨论】:

  • 完美!是的,它奏效了。这几天真是太丢脸了。谢谢 EJP。
  • @mervyn.777 请不要将您的代码编辑到我的答案中。把它放到你的问题中。
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2016-10-18
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多