java时间同步代码

qlfbtfca  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(374)

我正在写一些代码,需要知道客户端和单个服务器的时间有多不同步。
我试图通过在服务器上托管的smb共享上创建一个临时文件并读取其上次修改的时间来实现这一点。我认为(可能是错误的)时间戳将由服务器而不是客户端生成。因为看起来客户真的可以把事情搞砸。
有人能证实这种行为,或者想出一种不同的方法吗?

xn1cxnb4

xn1cxnb41#

你可以在一个普通的ntp服务器上同步这两者,而不用担心。额外的奖励有一个(更多)正确的时钟!

7lrncoxx

7lrncoxx2#

我想这里涉及的可变延迟(比如io)是关键问题。你想要多好的量度?我也不确定这是否(严格地说)与java有关。
无论如何,我认为你需要一个比较手术。
两台不同的机器正在向共享设备(您的smb)写入数据,每台机器创建一个包含其epoch的文件。理想情况下,为了最大限度地减少延迟问题,您应该在写入之前获取这个epoch,然后立即关闭文件。
然后,客户机将自己的epoch和文件时间戳与服务器的文件及其epoch内容进行比较。这4个度量应该提供足够的信息来了解两个jvm的epoch时间之间的相对差异。
[编辑以澄清]
例如,服务器的元组是({epoch,ts}):{s\u t,smb\u ts},客户端是{c\u s\u t,smb\u ts}。假设你得到(有趣的数字){5000,4800}和{5100,5000}。获取服务器的时间戳和客户机的时间戳之间的差异(这里是4800-5000=>-200),然后添加到客户机的epoch(这里是5100+(-200)=>4900)。所以客户端在服务器后面100个单位。
[最终编辑]:(请注意,这里要处理3个时钟:smb、服务器和客户端。)

mwg9r5ms

mwg9r5ms3#

为什么不在客户机上获取epoch时间并在客户机开始与服务器通信时将其发送到服务器,这样就不需要smb共享了。通过将历元时间与另一历元时间进行比较,可以得到以秒为单位的时间偏移量。可以使用rest/soap、socket等在客户机和服务器之间进行通信,具体取决于客户机/服务器模型的外观。

相关问题