为啥我的数据报包响应不完整?

Posted

技术标签:

【中文标题】为啥我的数据报包响应不完整?【英文标题】:Why is my Datagram Packet response incomplete?为什么我的数据报包响应不完整? 【发布时间】:2019-06-30 20:03:53 【问题描述】:

我正在尝试构建一个 android 应用程序来执行 UDP 请求。但是,每当我尝试接收响应时,响应字符串中的最后四个字符都会丢失。响应长度应为 38 个字节。

我已经尝试指定要使用的编码,但没有太大区别。

private void updateState() 
    final byte[] msg = hexStringToBytes("24000034...");

    new Thread(new Runnable() 
        public void run() 
            try 
                InetAddress bulbAddress = InetAddress.getByAddress(ipAddr);
                if (!socket.getBroadcast()) socket.setBroadcast(true);
                DatagramPacket packet = new DatagramPacket(msg, msg.length, bulbAddress, 56700);
                socket.send(packet);
                DatagramPacket packet1 = new DatagramPacket(msg, msg.length, bulbAddress, 56700);
                socket.receive(packet1);

                TextView textView = (TextView) findViewById(R.id.state);
                String out = new String(packet1.getData(), packet1.getOffset(), packet1.getLength());

                textView.setText(toHex(out));
             catch (Exception ex) 
                ex.printStackTrace();
            
        
    ).start();


private static byte[] hexStringToBytes(String input) 
    input = input.toLowerCase(Locale.US);
    int n = input.length() / 2;
    byte[] output = new byte[n];
    int l = 0;
    for (int k = 0; k < n; k++) 
        char c = input.charAt(l++);
        byte b = (byte) ((c >= 'a' ? (c - 'a' + 10) : (c - '0')) << 4);
        c = input.charAt(l++);
        b |= (byte) (c >= 'a' ? (c - 'a' + 10) : (c - '0'));
        output[k] = b;
    
    return output;


public String toHex(String arg) 
    return String.format("%040x", new BigInteger(1, arg.getBytes()));

我希望最后四个字符存在,并且是 FF FF 或 00 00。

【问题讨论】:

UDP 不会丢弃部分数据报。如果发送了这些字节,它们将被接收。你怎么知道他们被发送了? 嗨@user207421,我尝试使用Packet Sender 发送相同的消息,并且输出了最后4 个字符。我已经在桌面和设备本身上尝试过。 您不应将数据转换为字符串并返回字节。只需将实际字节和长度直接传递给toHex()。字符串不是二进制数据的容器。 嗨@user207421,我想我已经找到了问题,我需要使用一个没有新长度为28字节的值的新字节数组,而不是使用只有26字节的数组并传递它进入数据包1。在某些时候,我完全忽略了第一个数据包比响应小两个字节的事实。感谢您的帮助:) 【参考方案1】:

我想我找到了问题所在,我需要使用一个没有新长度为 28 字节的值的新字节数组,而不是使用只有 26 字节的数组并将其传递给 packet1。在某些时候,我完全忽略了第一个数据包比响应小两个字节的事实。

【讨论】:

以上是关于为啥我的数据报包响应不完整?的主要内容,如果未能解决你的问题,请参考以下文章

通过 LAN 广播 UDP 数据报包

为啥我不能用我的 api 响应更新我的状态?数据是一个对象数组

android中具有固定数据报包长度的datagramsocket中的音频流质量不好

为啥我的 Keras TimeDistributed CNN + LSTM 模型期望形状不完整

为啥我的页面可以获取 Vue.js 2 数据属性但它不是响应式的?

为啥 jquery 数据表不响应点击?