DatagramPacket getData()不工作
DatagramPacket getData() not working
我正在尝试使用以下代码从 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: ÛÏÌ<
好消息是,我正在连接到正确的服务器并取回一个数据包。但是,我似乎无法将该数据包的数据转换为该数据的可理解表示。我错过了什么?
时间协议的响应是网络字节顺序的 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' 这是自 1970 年 1 月 1 日以来的秒数:
long secondsSince1Jan1900 = Integer.toUnsignedLong(time);
long differenceBetweenEpochs = 2208988800L;
long secondsSince1Jan1970 = secondsSince1Jan1900 - differenceBetweenEpochs;
Instant instant = Instant.ofEpochSecond(secondsSince1Jan1970);
我正在尝试使用以下代码从 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: ÛÏÌ<
好消息是,我正在连接到正确的服务器并取回一个数据包。但是,我似乎无法将该数据包的数据转换为该数据的可理解表示。我错过了什么?
时间协议的响应是网络字节顺序的 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' 这是自 1970 年 1 月 1 日以来的秒数:
long secondsSince1Jan1900 = Integer.toUnsignedLong(time);
long differenceBetweenEpochs = 2208988800L;
long secondsSince1Jan1970 = secondsSince1Jan1900 - differenceBetweenEpochs;
Instant instant = Instant.ofEpochSecond(secondsSince1Jan1970);