2009-05-29 200 views
19

我需要我的軟件與NTP服務器通信以確定本地時鐘偏移量。我嘗試過使用org.apache.commons.net.ntp包,但在Windows上運行時,由於使用System.currentTimeMillis()來確定NTP包交換之前和之後的時間,因此它的實現相當差。正如你可能會或可能不知道的,這個值只在系統時鐘滴答時更新,在大多數現代Win2k3服務器上,這個值是64Hz或每15.625ms。這大大限制了時鐘偏移計算的準確性。Java NTP客戶端

Ntpd使用CPU高頻定時器在系統時鐘滴答之間進行插值,並實現更高的解析時間。你知道使用這種或類似技術的Java實現嗎?或者你知道除Apache之外的其他NTP實現嗎?

+0

你能不能補丁提交給Apache下議院庫? – 2009-06-01 13:10:53

+2

有時間來實施和測試它,以及我的公司霸主的意願,是的,我可以。 – 2009-06-03 08:33:34

+0

我在* Software Recommendations Stack Exchange *上詢問了[類似的問題](https://softwarerecs.stackexchange.com/q/48920/1255)。 – 2018-03-01 22:11:41

回答

3

如果您使用的是Java 5或更高版本,是否可以使用System.nanoTime()來更準確地測量時間偏移?你必須修改你現有的NTP代碼,但你應該有它的來源,我不希望這會很困難。

+0

是的,System.nanoTime()訪問高頻計時器,我期望這將用於體面的Java NTP實現中的時間戳。然而,這是不平凡的,所以我希望別人已經完成並調試它。 – 2009-05-29 10:15:09

9

一個NTP Java實現。由於這個問題排名非常高在谷歌的「Java NTP客戶端」:

Android有一個不錯的,緊湊的Apache授權執行一個簡單的NTP客戶端:android.net.SntpClient

它需要修改才能在非Android java上運行,但這應該是微不足道的,因爲代碼大約有100行代碼加上另外100行的詳細註釋,除了Android系統時鐘外沒有外部依賴 - 偶然的,它已經準備好接受像nanoTime()這樣的相關定時器,因爲它已經使用了這樣一個相對定時器。