时间同步代码

时间:2009-11-02 19:31:40

标签: java synchronization

我正在编写一些代码,需要知道客户端与单个服务器的时间有多大不同步。

我正在尝试通过在服务器上托管的SMB共享上创建临时文件并读取其上次修改时间来实现此目的。我认为(可能不正确)时间戳将由服务器而不是客户端生成。因为看起来客户真的会把事情弄得一团糟。

有人可以确认此行为或提出不同的方法吗?

3 个答案:

答案 0 :(得分:2)

为什么不在客户端上获取纪元时间并在客户端开始与服务器通信时将其发送到服务器,然后不需要smb共享。通过将纪元时间相互比较,您将获得以秒为单位的时间偏差。可以使用rest / soap,socket等在客户端和服务器之间进行通信,具体取决于客户端/服务器模型的外观。

答案 1 :(得分:2)

您可以将它们与公共NTP服务器同步,而不用担心它。增加了一个(更多)正确时钟的好处!

答案 2 :(得分:1)

我猜这里涉及的变量延迟(例如IO)是关键问题。你正在寻找一个多么好的措施?我也不确定(严格来说)这与Java有关。

无论如何,我认为您需要进行比较操作。

两台不同的计算机正在写入共享设备(您的SMB),每台计算机都会创建一个包含their epoch的文件。理想情况下,为了最大程度地减少延迟问题,您需要在写入之前获取此时期,然后立即关闭该文件。

然后,客户端将其自己的纪元和文件时间戳与服务器的文件及其纪元内容进行比较。这4项指标应提供足够的信息,以便深入了解两个JVM的纪元时间之间的相对差异。

[编辑澄清]

例如,服务器的元组是({epoch,ts}):{S_t,SMB_ts}和客户端{C_S_t,SMB_C_ts}。让我们说你得到(有趣的数字){5000,4800}和{5100,5000}。在服务器的时间戳和客户端的戳(这里是4800 - 5000 => -200)之间取差异,并添加到客户端的纪元(这里是5100 +( - 200)=> 4900)。所以客户端是服务器后面100个单位。

[最终编辑] :(请注意,此处有3个时钟可以处理:SMB,服务器和客户端。)