2012-02-10 165 views
3

在我的應用程序中,我有一個服務器和x客戶端。當客戶端啓動時,他從服務器獲得當前系統時間。每個客戶端都必須使用服務器時間,並且不能使用他自己的系統時間。服務器和客戶端之間的同步時鐘

現在我的問題:什麼是運行與當前服務器時間啓動和運行接近同步它不接受每x秒的時間服務器在客戶端上時鐘的最佳方式?

目標是在客戶端上顯示帶有服務器時間的運行時鐘。

客戶端時鐘可能有公差是關於24小時1秒。

在我的解決方案我有觸發每500ms和服務器的時間計數爲500ms定時器執行時一個定時器。但這不是一個好的解決方案:)因爲客戶端時鐘與服務器時間不同。

感謝您的回覆要做到這一點

+0

這樣做有什麼目的?你需要輪詢時間,經常或有可能重新考慮你的解決方案,只需要時間,當你需要它? – Marthin 2012-02-10 08:00:58

+3

我會依賴現有解決方案:http://en.wikipedia。org/wiki/Network_Time_Protocol(儘管這不會強制客戶端使用服務器時間...) – 2012-02-10 08:01:45

+0

問題更新。 – Seffel 2012-02-10 08:35:00

回答

2

我找到完全適合我的情況一個解決方案的好處。 而不是使用System.currentTimeMillis(),我使用System.nanoTime()System.nanoTime()獨立於系統時鐘。

當我收到當前服務器時間,我節省額外的從系統中納秒。然後,當前服務器時間將根據服務器接收時間與當前nanoTime加上服務器時間之間的差值來計算。

例子:

// The Client starts and receive the current Server time and the nanoTime 
private long   serverTime = server.getCurrentTime(); 
private long   systemNano = System.nanoTime(); 

//To calculate the current Server time without a service call 
                     //ns-> ms 
long currentServerTime = serverTime + ((System.nanoTime() - systemNano)/1000000); 

THX

1

一種方法是讓服務器時間和本地時間之間的區別,並用這些時間計算

  • 客戶端啓動,並從獲取時間服務器(我將假設使用當前時間以毫秒爲單位,但可以根據您使用的情況進行調整)
  • 客戶端檢查其當前系統時間並保存差異
  • 然後可以始終施加到當前系統時間在客戶機上,以計算服務器時間

實施例:

long serverTime = 1328860926471l; // 2012/02/10 10:02, received from wherever 
long currentTime = System.currentTimeMillis(); // current client time 
long difference = currentTime - serverTime; 

// Server time can then me retrieved like this: 
long currentServerTime = System.currentTimeMillis() - difference;  
Date serverTimeDate = new Date(currentServerTime); 

顯然的差值必須被保存在接收到的服務器時間的時刻。

+0

客戶更改系統時間時發生了什麼?這就是爲什麼我要在客戶端上使用'System.currentTimeMillis()'來尋找解決方案。 – Seffel 2012-02-10 08:38:18

+0

是的,如果用戶在運行程序時改變系統時間,這個解決方案會給出錯誤的結果,那麼它需要經常檢查當前的服務器時間。網絡時間協議會給你最好的結果,假設你能夠使用它。 – 2012-02-10 08:56:50

+0

我不認爲這有效。它依靠客戶端時鐘來確保正確,這就是問題所在。你只有一個時鐘,一個在服務器上。 – momomo 2013-07-23 16:13:26

1

你幾乎應該使用建立的時鐘同步的方法,如the Network Time Protocol而不是建立自己的定製解決方案。它會爲您提供更好的結果比你會讓你自己,你有你的所有服務器同意它是什麼時候:-)

相關問題