DatagramPacket getData()不起作用

时间:2016-11-11 04:49:31

标签: java eclipse packet datagram timestamping

我试图使用下面的代码从nist.gov服务器上获取时间戳。

InetAddress addr = InetAddress.getByName("129.6.15.30");
DatagramSocket s = new DatagramSocket();
System.out.println("Connected to: "+addr.getHostName());

byte[] buf = new byte[4];
DatagramPacket p = new DatagramPacket(buf, buf.length, addr, 37);
s.send(p);
System.out.println("message sent");

DatagramPacket dp = new DatagramPacket(buf, buf.length);
s.receive(dp);
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println("Received: "+data);

当我在Eclipse上运行它时,我在控制台中得到了以下内容。

Connected to: time-c.nist.gov
message sent
Received: ÛÏÌ<

好消息是,我正在连接到正确的服务器并取回数据包。但是,我似乎无法将该数据包的数据转换为该数据的可理解表示。我错过了什么?

1 个答案:

答案 0 :(得分:0)

时间协议的响应是网络字节顺序的32位整数 - 这是一个字符串。

要阅读它,您需要使用DataInputStream

之类的内容
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dp.getData(), 0, dp.getLength()));

int time = dis.readInt();

dis.close();

返回的时间值是自1900年1月1日以来的秒数,从此获取Java Instant我们需要将无符号整数转换为标准Java'epoch',这是自1st以来的秒数1970年1月:

long secondsSince1Jan1900 = Integer.toUnsignedLong(time);

long differenceBetweenEpochs = 2208988800L;

long secondsSince1Jan1970 = secondsSince1Jan1900 - differenceBetweenEpochs;

Instant instant = Instant.ofEpochSecond(secondsSince1Jan1970);