java - 收到不完整的 UDP 数据包

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

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

最佳答案

您需要在每次接收前重置数据报包长度。否则它会不断缩小到迄今为止收到的最小数据包。

关于java - 收到不完整的 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11869261/

相关文章:

java - 保存常量和枚举的正确位置是什么?

android - fragment 过渡时屏幕闪烁

java - 通过socket将asn1数据从客户端发送到服务器

c - 在 MSG_DONTWAIT 模式下使用 recvfrom() 从原始套接字读取以太网数据包

c - 在 Windows 上为一个 libevent 绑定(bind)创建 3 个套接字?

java - Solrj 查询 https 协议(protocol)错误

Java 8 支持 Jersey 框架

android - Qt5.1-安卓: Qt version for mips missing in QtCreator

java - 来自 Java 的 HDFS - 指定用户

java - 如何将字符串 arraylist 转换为 double 以便 arraylist 可以返回排序值