【问题标题】:DatagramPacket getData() not workingDatagramPacket getData()不起作用
【发布时间】:2017-03-25 06:56:12
【问题描述】:

我正在尝试使用以下代码从 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: ÛÏÌ<

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

【问题讨论】:

    标签: java eclipse packet datagram timestamping


    【解决方案1】:

    时间协议的响应是网络字节顺序的 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);
    

    【讨论】:

    • 这绝对有帮助,因为我收到的新输出是 Received: -607100146。现在,要弄清楚如何将其转换为标准格式的时间戳。
    • 将转换添加到Instant
    • 谢谢你,格雷格,因为这有效,我立即得到以下输出:2016-11-11T18:27:50Z。虽然我感谢你的回答,但我不想只是说,“太好了!这个人为我做的!”我很好奇的是 2208988800 之后的“L”是什么意思。我知道 2208988800 是 1/1/1900 和 1/1/1970 之间的秒数,但是 L 是什么(原谅我,我已经只使用 Java 编码 4.5 个月,有时像这样的小细节让我无法理解)。
    • 它只是说这是一个long 值而不是int(也允许使用小写l)。 2208988800 太大而不能成为 int
    • 我就是这么想的。最后很简单。只是学习过程的一部分。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 2016-09-30
    • 2021-12-31
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多