处理从java中的UDP端口接收的字节

时间:2015-03-30 20:28:51

标签: java udp

我正在尝试使用Java从localhost上的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);
    }

3 个答案:

答案 0 :(得分: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);
}

希望它有所帮助。

答案 1 :(得分:0)

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

顺便说一句,引用您阅读的部分的代码是受欢迎的。祝你好运......

答案 2 :(得分:0)

你需要:

  1. 您收到的数据包格式规范。
  2. 围绕用于构建DataInputStream的字节数组的ByteArrayInputStream缠绕的DatagramPacket,不要忘记使用带有偏移和长度的构造函数,这是从DatagramPacket.
  3. 调用与(1)对应的适当DataInputStream方法的代码。
  4. 目前你似乎没有(1)。没有它,你就没有希望。只是想要有意义的&#39;二进制数据,特别是打印它,完全浪费你的时间。

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

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

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

    为什么你试图打印浮点数据,好像它是文本仍然是一个谜。