2016-12-25 170 views
7

在我的服務器端腳本中,我調用兩個同時發射,看起來像這樣。Socket.io同步倒計時?

if (songs.length > 0) { 
    socket.emit('data loaded', songs); 
    socket.broadcast.to(opponent).emit('data loaded', songs); 
} 

一個是對於對手,另一個是對自己。

我的問題是當數據被加載時,我的android應用程序中會出現兩位玩家的倒計時。 對我來說重要的是他們在屏幕上看到相同的號碼並同時播放音樂。

我接受所有提示。

+0

也許客戶端會發回一個令牌,表示他們在倒計時的位置,並且只有當它們具有相同的值時才發送消息來倒計時?不幸的是,如果你考慮到每個用戶的延遲,我認爲這可能是唯一的方法。 –

+0

@SamJudge你能用代碼示例解釋更多嗎? – enucar

+0

你需要多精確?用戶彼此距離有多遠?用戶和服務器之間的延遲是多少?使用上面的代碼,兩個用戶應該非常接近同步,但這取決於您的「同步」定義... – jcaron

回答

0

我做了一個應用程序,我遇到了同樣的問題。在那種情況下,我解決了將時間控制留給服務器的問題。服務器發送給客戶端和客戶端增加時間。也許在你的情況下,你可能有連接問題。如果問題存在,您可以讓客戶自己增加時間,有時用正確的同步時間發送打勾。

0

我可以給你類似波紋管的東西,但我沒有測試。 該解決方案具有下列步驟操作:

  1. clientserver同步計時器。所有用戶與服務器定時器具有相同的difference
  2. 對於期望的response/request獲取客戶端時間並查找帶有服務器時間的differences
  3. 考慮將smallest作爲第一個倒計時開始。
  4. 對於每個response(socket)differencesmallest,讓等待不亞於此time後,客戶端計數器開始。

在響應數據中獲取0的客戶端將立即啓動。 和您可能會遇到的主要問題是broadcast方法,如果您認爲此解決方案有幫助,則無法使用該方法。 This is a post may will help you.

0

將時間添加到發射消息中。 假設歌曲是
{"time" : timeString, "songs" : songsList}的對象。

如果我們考慮設備時間是正確的您可以計算信息所需的時間旅行,然後使用服務器計時器作爲主要計算器。

客戶端會得到時間倒計時應該開始:

var start = false; 
var startTime = 0; 
var myTime = new Date().getMilliseconds(); 
var delay = 1000 - myTime; 

setTimeout(function(){ 
    intervalID = setInterval(function(){ 
     myTime = new Date().getTime(); 
     //console.log(myTime); to check if there is round number of milliseconds 
     if (startTime <= myTime && start = true) {startCountdown();} 
    }, 100); //put 1000 to check every second if second is round 
      //or put 100 or 200 is second is not round 
}, delay); 

socket.on('data loaded', data){   
    startTime = data.time; 
    start = true; 
} 

function startCountdown(){ 
    //your time countdown 
} 

而當2個客戶來自同一時域工作正常,因此,您將需要「時間轉換器」,檢查時間是不是好的原因如果您嚴格需要相同的號碼

後倒計時已經結束,您應該clearInterval(intervalID);

1

至於JS計時器有關將差量小。我們可以通過縮短延遲時間來縮短時間差異,從服務器獲取請求和響應時間之間的差異。需要發送請求和取回響應之間

function syncTime() { 
console.log("syncing time") 
var currentTime = (new Date).getTime(); 

res.open('HEAD', document.location, false); 
res.onreadystatechange = function() 
{ 
    var latency = (new Date).getTime() - currentTime; 
    var timestring = res.getResponseHeader("DATE"); 
    systemtime = new Date(timestring); 
    systemtime.setMilliseconds(systemtime.getMilliseconds() + (latency/2)) 
}; 
res.send(null); 
} 

經過的時間來計算,除以2.值,使得您的等待時間的粗略值。如果從服務器添加到時間價值,你會更接近真實服務器時間(區別將是微秒)

參考:http://ejohn.org/blog/accuracy-of-javascript-time/

希望這有助於。