【问题标题】:processing bytes received from UDP port in java在java中处理从UDP端口接收到的字节
【发布时间】:2015-03-30 20:28:51
【问题描述】:

我正在尝试使用 Java 从本地主机上的 UDP 端口读取数据。我对 Java 很擅长,但我现在有一段时间无法解决这个问题......

问题是,在我使用DatagramSocket 连接并使用DatagramPacket 接收数据包后,我得到一些没有意义的字节,我看不到与我期望的数据的连接。打印输出如下:

$őZAŇ"¤E€^ĽxΕ’M@ŢúCîS5;Ń8†8Ŕ$5»ôxŕ¸Ţf+?’Ť;Ů%>ż?>żA€ĹĽ‘_

所以,我显然是以错误的方式处理某些事情。我还阅读了一些 Java 的签名/未签名数据问题。

大约一年前,我使用 C# 创建了一个类似的应用程序,一切都很顺利。

真心希望有人能帮忙。

这是代码(其中一个版本,我尝试了很多不同的解决方案)

 DatagramSocket mySocket = new DatagramSocket(null);
    InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 20777);
    mySocket.bind(addr);
    byte[] receiveData = new byte[152];
    while(true)
    {
        DatagramPacket receivePacket = new DatagramPacket(receiveData, 0, receiveData.length);
        mySocket.receive(receivePacket);
        byte[] barray = receivePacket.getData();

        ByteArrayInputStream inputStream = new ByteArrayInputStream(barray);
        DataInputStream dInputStream = new DataInputStream(inputStream);
        float a = dInputStream.readFloat();
        System.out.println(a);
    }

【问题讨论】:

  • 你能贴出你用来传输和接收数据的代码吗?
  • 代码前接收现在可用。我不熟悉发射器的代码,是一个windows应用程序...

标签: java udp


【解决方案1】:

使用此方法,您可以将字节数组转换为十六进制字符串表示形式。

private String bytesToHex(byte[] bytes) {
    char[] hexArray = "0123456789ABCDEF".toCharArray();
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}

希望对你有帮助。

【讨论】:

  • 感谢 Hector,我得到了 hexa 字符串,但仍然没有运气,这些数据没有任何意义。在发送数据的服务器文档中指出:“所有字段都是浮点数据类型(在 C# 中)”。我正在尝试将我想到的任何东西转换成任何东西,但我仍然卡住了
【解决方案2】:

我不会将您的问题标记为重复,因为这是您的第一个问题,但我认为您应该参考 this other exchange。可以为您的问题提供一个非常优雅和清晰的解决方案。

顺便说一句,欢迎引用阅读您打印的部分的代码。祝你好运……

【讨论】:

  • 谢谢,我之前浏览过链接,但没有帮助,所以我写了这个问题。代码现在可用...
【解决方案3】:

你需要:

  1. 您接收的数据包格式规范。
  2. 一个 DataInputStreamwrapped 一个 ByteArrayInputStream 围绕你用来构建 DatagramPacket, 的字节数组,不要忘记使用从 DatagramPacket. 获得的带有偏移量和长度的构造函数
  3. 调用对应于 (1) 的适当 DataInputStream 方法的代码。

目前您甚至似乎没有 (1)。没有它,你就没有希望。仅仅试图“理解”二进制数据,尤其是仅仅打印它,完全是在浪费您的时间。

编辑如果根据您的评论,所有字段都是floats,只需循环调用DataInputStream.readFloat() 的数据报,直到它抛出EOFException

try
{
    while (true)
    {
        float f = dataInputStream.readFloat();
        System.out.println(f);
    }
}
catch (EOFException exc)
{
    // expected
}

如果这不起作用(即产生可识别的价值),您将不得不切换到 DatagramSocketChannelByteBuffer 并尝试不同的字节顺序可能性。

为什么您要像打印文本一样打印浮点数据仍然是个谜。

【讨论】:

  • 谢谢,我尝试了很多方法来解决这个问题,但问题是,我没有发射器的来源,我只知道有一个数字序列(浮动点)我需要在本地主机上的某个端口上阅读。我已经用代码更新了帖子...
  • 您没有说明您编辑的代码有什么问题,但是您的新代码每个数据报读取一个浮点数。您的描述读起来就像每个数据报有多个浮点数,无论如何循环读取它们都没有什么坏处,正如我所描述的(通过编辑略有改进)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2017-12-24
相关资源
最近更新 更多