java - 我怎样才能在java中访问NTP时钟

标签 java clock ntp

我有一个用 java 编写的分布式程序。我希望我的节点访问同步的物理时钟。

我知道NTP是一种物理时钟同步协议(protocol)。我知道我可以通过 sudo apt-get ntp 在 linux 上安装它。

我的问题是当我安装它时,如何在我的 java 程序中访问这个同步时钟?我的意思是当我在我的机器上安装 ntp 时会发生什么?我的系统 时钟 会同步吗?

谢谢:)

最佳答案

如果想在 Java 中访问 NTP 信息,您可以创建符合 NTP 数据包格式 (NTP RFC-1305) 的 UDP 数据包,将模式字段设置为 MODE_CLIENT (3) 然后将数据包发送到端口 123 上的 NTP 服务器并监听响应.

Apache Commons Net library已经有了仅使用几行代码即可执行此操作的框架。

 NTPUDPClient client = new NTPUDPClient();
 client.open();
 InetAddress hostAddr = InetAddress.getByName("*insert-target-server-host-name.com*");
 TimeInfo info = client.getTime(hostAddr);
 info.computeDetails(); // compute offset/delay if not already done
 Long offsetValue = info.getOffset();
 Long delayValue = info.getDelay();
 String delay = (delayValue == null) ? "N/A" : delayValue.toString();
 String offset = (offsetValue == null) ? "N/A" : offsetValue.toString();

 System.out.println(" Roundtrip delay(ms)=" + delay
                + ", clock offset(ms)=" + offset); // offset in ms
 client.close();

请注意,本地时钟偏移(或时间漂移)是根据此标准 NTP 等式相对于本地时钟和 NTP 服务器时钟计算的。

LocalClockOffset = ((ReceiveTimestamp - OriginateTimestamp) +
                             (TransmitTimestamp - DestinationTimestamp)) / 2

其中 OriginateTimestamp (t1) 是客户端发送数据包的本地时间,ReceiveTimestamp(t2) 是 NTP 服务器收到请求的时间, TransmitTimestamp (t3) 是服务器发送回复的时间,DestinationTimestamp (t4) 是客户端在本地机器上收到回复的时间。

完整代码见客户端示例:
https://commons.apache.org/proper/commons-net/examples/ntp/NTPClient.java

关于java - 我怎样才能在java中访问NTP时钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38711730/

相关文章:

java - 有人在 Jetty 7 上成功部署 Sonar 了吗?

python - 自动更新的打印时间

ntp 问题 : slewing versus jumping the time

linux - 如何让ntpd在重启后立即同步?

java Communications link failure 最后一个数据包成功发送到服务器

java - 如何使用HashMap忽略字符串中的空格、大写字母和标点符号?

java - 调度周期性任务和时钟漂移

Android和JNI实时时钟

linux - 网络时间协议(protocol) (NTP)

java - 捕获双击托盘中图标的事件