如何在java中访问NTP时钟

时间:2016-08-02 04:22:34

标签: java clock ntp

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

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

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

谢谢:)

2 个答案:

答案 0 :(得分:7)

设置ntp时,系统时间将与ntp服务器时间同步。 当您使用System.currentTimeMillis()时,将具有自动调整的系统时钟的值。

您应该知道Timer可能对系统时钟的变化敏感,而ScheduledThreadPoolExecutor则不然。您可以查看Scheduler Impacts with clock changes

答案 1 :(得分:5)

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

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 是NTP服务器收到的时间请求(t2), TransmitTimestamp 是服务器(t3)发送的时间回复,而DestinationTimestamp是客户端在本地计算机上收到回复的时间(t4)。

请参阅客户端示例获取完整代码:
https://commons.apache.org/proper/commons-net/examples/ntp/NTPClient.java