首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在java中访问NTP时钟?

如何在java中访问NTP时钟?
EN

Stack Overflow用户
提问于 2016-08-02 04:22:33
回答 2查看 14.4K关注 0票数 7

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

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

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

谢谢:)

EN

回答 2

Stack Overflow用户

发布于 2016-09-03 17:30:50

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

已经有了只使用几行代码就可以完成这一任务的框架。

代码语言:javascript
运行
复制
 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服务器的时钟计算的。

代码语言:javascript
运行
复制
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

票数 11
EN

Stack Overflow用户

发布于 2016-08-02 05:11:46

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

您应该知道计时器可能对系统时钟中的更改很敏感,而ScheduledThreadPoolExecutor不是。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38711730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档