客戶端實現正確的伺服器時間同步

2021-06-22 13:25:27 字數 2043 閱讀 2675

**:

一、問題描述

需要解決的問題很簡單,就是如何在頁面上比較準確的顯示伺服器時間。目前比較常用的方法就是根據基準時間使用settimeout或 setinterval來計算最新的時間,這樣的問題在於settimeout與setinterval的時間精度比較低,經測試一分鐘大概能相差幾秒 (與電腦效能以及執行的任務也相關),這樣的精度在某些需求下是無法滿足的。除此之外,如果要獲得比較準確的時間可以定期與伺服器進行校準,只是這樣實現 的成本大一些。

本文嘗試了一種改良的客戶端實現時間同步的方式,具有以下的特點:

二、具體實現

1. 為了解決原方案中的時間精度問題,這裡不再使用settimeout和setinterval來直接計算時間,而是直接使用客戶端時間(ct)。不過客戶 端時間很可能與伺服器時間(st)不同步,這需要在頁面載入的時候計算出客戶端與伺服器的時間差值(δt),這樣只需在客戶端時間上做一下修正即可得到準 確的伺服器時間(st』 = ct - δt)。

2. 由於客戶端時間很可能被使用者修改,因此直接按照步驟1中的方式計算,一旦使用者修改了時間,計算出來的伺服器時間也將隨之發生變化。這就需要檢測出客戶端時 間的變化並消除這個變化。檢測的方法很簡單,即在每個計算週期(t)都將當時的客戶端時間(ct2)與上乙個週期的客戶端時間(ct1)做比較,一旦兩個 週期的差值(δt』 = ct2 - ct1 - t)大於某個預設值(s)時就將差值(δt』)加入到δt中,即此時的δt = δt + δt』。之所以需要設定乙個預設值,是因為每個週期的時間本身不是固定的(依賴於settimeout),因此δt』並不會等於0,如果每次都將 settimeout造成的誤差作為ct與st之間的誤差將會造成計算不準確。經過以上的計算,使用者修改時間後將不會對計算結果產生影響。

3. 經jk提醒,完成以上兩步還有乙個問題,當使用者離開當前頁面之後後退回頁面時,時間計算不準確。問題在於基準時間是伺服器給的,在第一次進入頁面的時候確 定,當使用者後退回當前頁面時,基準時間並沒有變,這樣會導致重新從過期的基準時間開始計算,導致不準確。需要解決這個問題就是需要解決跨頁面的資料儲存問 題,這在之前的《ajax應用中瀏覽器歷史的相容性解決方案》一 文中已經說明,即通過表單元素來記憶。具體的實現方案是,頁面第一次載入時建立兩個input,乙個用於儲存最近一次的客戶端時間,乙個用於儲存最近一次 的基準時間。如果發現已經存在input(前進、後退、非強制重新整理)則比較上一次的客戶端時間與當前客戶端時間,如果其差值大於某個預設值則像步驟2中一 樣進行校準,只不過使用的將是最新的基準值。

具體的**實現如下

/*定義*/

varsynctimer = (

function

() basetime 基準時間 

* @param  updater 時間更新時的*** 

* @param  interval 校準計算週期時長,預設為200ms。 

* @param  threshold 兩個檢查週期之間的時間誤差(差值-週期時長)如果大於閾值則視為客戶端時間有調整,預設為500ms。 

*/run: function

(basetime,updater,interval,threshold)    

}    

varct = +

newdate;    

vardiff = ct - basetime;    

varpt = ct,cct;    

(function

()    

varfixedtime = cct - diff;    

updater( fixedtime );    

pt = memoryel.value = cct;    

basetimeel.value = fixedtime;    

settimeout(arguments.callee,interval);    

})();    

}    

}    

})();    

/*使用*/

window.onload = function

());    

}    

三、總結

1 樓 zhanghh315 昨天  

android客戶端與伺服器時間同步

如何保障android客戶端與伺服器時間同步,不受使用者更改系統時間的影響?ntp原理如下 device a傳送乙個ntp報文給device b,該報文帶有它離開device a時的時間戳,該時間戳為10 00 00am t1 當此ntp報文到達device b時,device b加上自己的時間戳,...

python socket 實現伺服器 客戶端通訊

伺服器 usr env bin python coding utf 8 import socket server def server sock socket.socket socket.af inet,socket.sock stream sock.bind localhost 8000 sock...

客戶端獲取伺服器時間記時

客戶端獲取伺服器時間倒計時 倒計時是我們生活中比不可少的,尤其是搞程式開發的,涉及到電子商務的。都有倒計時的這個技術,首先我給大家分享一下我常常用的倒計時吧,一 用ajax寫倒計時,ajax寫倒計時,大家會發現乙個確定就是他不停的想伺服器傳送請求,如果多了的話,就會對伺服器施加壓力,大家如果要看看 ...