如何获取通过网络接收的双重类型的UDP数据包?

时间:2017-07-18 20:37:38

标签: java udp buffer packet

我编写了一个java程序,它只接收通过UDP套接字发送的数据并将其打印到屏幕上。收到的数据是从另一台使用matlab发送数据的计算机发送的。我很确定matlab仿真很好,因为它所做的只是采用双数据类型的常量值2,使用字节打包器打包数据并通过UDP块将其发送到指定的IP地址和端口。我同时在另一台PC上运行java代码,该代码接收数据包作为长度为1024的字节数组。

收到的数据很好,但是不断打印的值是

4.7783097267364807 E -299。

我不确定我的代码是否正确地从数据包中获取所需数据,或者是否正确使用了ByteBuffer.wrap(.....)。getDouble()函数。任何帮助将不胜感激

 import java.io.*;
 import java.net.*;
 import java.nio.ByteBuffer;

class receiver
{
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new DatagramSocket(1024);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
            System.out.println("Listening...");

            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  serverSocket.receive(receivePacket);
                  double data = ByteBuffer.wrap(receiveData).getDouble();
                  System.out.println(data);
               }
      }
}

1 个答案:

答案 0 :(得分:1)

根据规范,您的代码是正确的,但Matlab正在向您发送0x0200000000000000(或更短的内容:见下文)。作为double的2.0的big-endian表示形式为0x4000000000000000,因此它们当然不会向您发送double

要从他们实际发送给你的内容中获取2,请执行以下操作:

ByteBuffer  bb = ByteBuffer.wrap(receivePacket.getData(), 0, receivePacket.getLength());
bb.order(ByteOrder.LITTLE_ENDIAN);

然后按此顺序单独尝试以下操作,直到有效:

long l = bb.getLong();
int i = bb.getInt();
short s = bb.getShort();
byte b = bb.getByte();

没有缓冲区下溢。包装缓冲区的方式是忽略数据报长度,因此无法判断它们是发送一个,两个,四个还是八个字节。