我正在尝试使用Java从localhost上的UDP端口读取数据。 我对Java相当满意,但现在已经有一段时间无法解决了……

问题是,当我连接使用的DatagramSocket和接收数据包的DatagramPacket ,我得到一些字节有没有SENCE,我不能看到我所期望的数据连接。 打印输出如下所示:

$ő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);
    }

#1楼 票数: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);
}

希望能帮助到你。

#2楼 票数:0

我不会将您的问题标记为重复,因为这是您的第一个问题,但是我认为您应该参考其他交流 提供了一个非常优雅,清晰的解决方案来解决您的问题。

顺便说一句,引用阅读您所打印部分的代码将受到欢迎。 祝好运...

#3楼 票数:0

你需要:

  1. 您正在接收的数据包格式的规范。
  2. 一个DataInputStream围绕一个ByteArrayInputStream包裹,该ByteArrayInputStream围绕您用于构建DatagramPacket,的字节数组DatagramPacket,不要忘记使用从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并尝试不同的字节顺序可能性。

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

  ask by marina translate from so

未解决问题?本站智能推荐:

2回复

在Java程序中通过UDP接收C ++字节流

我有一个C ++应用程序通过UDP发送字节缓冲区(从结构填充)。 Java中的另一个应用程序接收相同的缓冲区,并将数据复制到类(Java Bean类)中。 我用下面的代码 但是,当接收到数据时,会发生异常“无效报头流” 有什么解决办法吗? 提前致谢
1回复

如何从像Java这样的php中接收udp数据包获取端口号

有什么办法可以通过在php中接收upd数据包来获取端口号..... 在Java中,我通常调用此函数raft.getPort()和packet.getAddress()来获取发送方的端口号和IP地址。 有什么办法可以在UDP中实现呢? 谢谢你提前.....
2回复

在Java中,如何实现UDP端口扫描?

在这里,我正在开发端口扫描程序,TCP运行良好,但我不知道如何对UDP端口进行扫描。 假设我想知道此LAN中另一台主机上的UDP端口XXXX是否已打开。 这段代码会完成这项工作吗? 如果没有,问题是什么? 只是一个新手,还在学习。 谢谢!
1回复

如何在Java中侦听UDP端口?

我必须在我的Java项目中为UDP监听3个不同的端口。 我按如下方式实现了我的系统: 我有一个实现Runnable的UDPMessageListener类。 我想创建3个作为此对象运行的线程。 我有一个名为“ UDPPacketProcessor ”的接口,它有一个onPacke
2回复

使用Java套接字处理无法访问的UDP端口

我正在使用Java DatagramSocket将数据流传输到多个不同的客户端。 当我自己处理当前注册的客户端列表时,我仅将套接字绑定到服务器端口,而不连接到任何特定的客户端。 但是,通过不使用connect(),我失去了DatagramSocket对无法访问的端口的ICMP通知作出反应
1回复

Java如何处理多个UDP数据包的接收?

想象一下UDP数据包中的以下情形: 服务器广播“ Hello”消息并等待答案 客户1回答“嗨” 客户2也回答“嗨” 现在,如果服务器在完成第一个答案的处理之前收到第二个答案,我会对服务器会发生什么感兴趣。 一方面,UDP在设计上是不可靠的,并且由于我第二次
4回复

用Java接收UDP数据

我正在尝试通过PlayCap接收UDP数据广播到Java中的网络地址192.168.103.255端口3000,但是我在设置方面遇到了麻烦。 这就是我所拥有的: 我从绑定调用得到“java.net.SocketException:已绑定”。 我对网络很缺乏经验,所以我可能在这里做错了
1回复

如何在java中的端口53上反映UDP数据包?

我用Java编写了该程序,并在Ubuntu 14下运行它。 运行它时,它将通过端口53将UDP数据包发送到在Debian 8.0下运行的缓存DNS服务器。 服务器将答复发送到源。 如何修改程序以使服务器回复同一局域网中的另一个IP地址? 这是程序: