2012-04-08 62 views
0

我想根據服務器的時間驅動一個setTimeout循環,僅秒。與JS客戶端同步服務器秒

因此,當服務器上的秒數爲30時,某些功能會在所有客戶端上運行。至關重要的是,它們不會與服務器完全不同步,因爲在服務器上運行CRON作業(例如45秒)對於系統正常運行非常重要。

如果客戶端與服務器幾秒鐘外出,那麼客戶端不需要彼此同步。

我正在使用jquery庫。

+0

還沒有,但我知道我不希望客戶端每秒鐘都要詢問服務器的秒數,因爲這會給客戶端帶來很多開銷?或者,客戶端只需要每分鐘詢問一次時間,並將腳本運行到它認爲時間必須滿足的時間,直到下一次重新同步爲止。 – imperium2335 2012-04-08 11:21:09

+0

因爲數據必須在服務器和客戶端之間傳輸,所以永遠不要精確。 – epascarello 2012-04-08 12:50:28

回答

0

如何使用Node.js和Socket.io

var io = require('socket.io').listen(80); 

io.sockets.on('connection', tick); 

function tick(socket){ 
    socket.emit("tick"); 
    setTimeout(function(){tick(socket)}, 30000); 
} 

客戶:

var socket = io.connect('http://serveraddr'); 
socket.on('tick', function (data) { 
    doSomething() 
}); 

它使用Socket.io服務器直接控制客戶端。

+0

我沒想到JS支持套接字。這是一種聊天應用程序,所以我認爲套接字是理想的,因爲它可以模仿JAVA套接字在基於JAVA的聊天室中的工作方式。這會給出同樣的行爲嗎?你的第一個腳本使用socket.emit在服務器上運行嗎?另一個在客戶端上運行? 我正在開發一個我的聊天項目,我正在嘗試解決用戶拔下連接插件等問題,以免最終導致系統充滿鬼用戶。 – imperium2335 2012-04-08 12:14:05

+0

@imperium2335,新的瀏覽器做,做一些研究。 – epascarello 2012-04-08 12:51:15

+0

我已經看過它,它似乎完美的我想要的,但無法弄清楚如何安裝此(我使用Windows)? – imperium2335 2012-04-08 15:00:35

0

在這種情況下,您可以使用long polling。 客戶端向服務器發送請求,服務器在一段時間後發送響應。 在回調中,您可以執行代碼。

0

當客戶端第一次加載時,它會要求服務器時間。或者你可以把當前的服務器時間渲染到JS中。

然後客戶端獲取當前本地時間,計算這兩者之間的增量,並使用該增量計算在任何給定時刻的當前服務器時間。當然,這種方法假定兩個時鐘不會分離太多(他們實際上不應該)。

+0

在大多數情況下,我會想到客戶機上的秒數可能與服務器上的秒數完全不同? – imperium2335 2012-04-08 12:14:53

+0

你是什麼意思?時鐘以不同的速度運行?我不這麼認爲。而對於靜態差異,我們有三角洲。 – 2012-04-08 12:16:54

+0

謝謝,我現在明白了,你如何計算三角洲? – imperium2335 2012-04-08 12:51:47

0

取決於您的解決方案(AJAX,頁面重新加載等),您可以在下次調用完成時將秒數傳遞給客戶端。這可以包含在對客戶呼叫的每個響應中。

E.g.客戶端調用服務器,服務器應答56s,客戶端在56秒內執行下一個呼叫。

+0

是否需要一種偏移量,即接收和發送請求之間的等待時間?因此,服務器在56時發送,但客戶端實際上在3秒鐘後獲得56,所以需要在客戶端上調整任何超時/間隔以補償最大延遲。 – imperium2335 2012-04-08 12:16:41

+0

對於時間不重要的應用程序,此方法可確保客戶端不會比預期更早執行呼叫。延遲不會總和,因爲客戶端在每次調用時都會得到一個新的_corrected_超時值。帶有測量延遲的真正「同步」有點複雜,因爲您無法確定瓶頸是連接還是客戶端或服務器上的處理。對於粗略估計,您可以測量,例如,AJAX請求開始時間和完成時間。 – diewie 2012-04-08 12:35:45