Socket.io同步倒计时?

在我的服务器端脚本,我调用两个同时发射,看起来像这样。

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

一个是对手,另一个是对自己。

我的问题是什么时候加载数据在我的Android应用程序中,两个玩家都会出现倒计时。 对我来说,重要的是他们在屏幕上看到相同的号码,同时播放音乐。

我打开所有提示。

就js定时器而言,这将是一个小小的差异。 我们可以通过缩短延迟时间来减less时间上的差异,从服务器请求到响应时间的差异。

 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/

希望这可以帮助。

我已经提出了申请,我也遇到了同样的问题。 在这种情况下,我解决了把时间控制留给服务器的问题。 服务器发送给客户端和客户端增加时间。 也许在你的情况下,你可能有连接问题。 如果问题存在,您可以让客户自己增加时间,并且有时候用正确的时间发送勾号以进行同步。

我可以给你像波纹pipe,但我没有testing。 该解决scheme具有以下步骤:

  1. 同步clientserver定时器。 所有用户与服务器定时器有相同的difference
  2. 对于所需的response/request获取客户端的时间,并找出与服务器时间的differences
  3. 考虑smallest第一个倒计时将开始。
  4. 对于每个response(socket) 减去 smallestdifference ,并让客户端计数器在等待这个time之后启动。

在响应数据中获得0的客户端将立即启动。 如果你认为这个解决scheme会有所帮助的话,你可能会遇到的主要问题就是你无法使用的broadcast方法。 这是一个post可能会帮助你。

添加时间到发射消息。 比方说,歌曲是一个对象
{"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);