Socket.io同步倒计时?

Socket.io countdown synchronously?

在我的服务器上我同时调用了两个 emits,看起来像这样。

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

一个给对手一个给自己.

加载数据后,我的 android 应用程序中应该会出现两个玩家的倒计时。对我来说,重要 他们在屏幕上同时看到相同的号码。准确地说,它应该 运行 同步。我该怎么做?

我申请了,遇到了同样的问题。在那种情况下,我解决了将时间控制留给服务器的问题。服务器发送给客户端,客户端增加时间。也许在您的情况下,您可能会遇到连接问题。如果问题存在,您可以让客户自己增加时间,有时发送带有正确同步时间的标记。

我可以给你类似下面的东西,但我没有经过测试。 此解决方案包含以下步骤:

  1. 同步 clientserver 的计时器。所有用户都具有相同的 difference 和服务器计时器。
  2. 对于所需的 response/request 获取客户端时间并找到带有服务器时间的 differences
  3. smallest 视为将要开始的第一个倒计时。
  4. 对于每个 response(socket) smallest 中减去 difference 并让客户端计数器在等待这个 [=19] 之后开始=].

在响应数据中获得 0 的客户端将立即启动。 您可能遇到的主要问题是 broadcast 方法,如果您认为此解决方案会有帮助,则不能使用该方法。 This is a post may will help you.

将时间添加到发出消息中。 假设歌曲是
{"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 个客户来自同一时区时,这很好用,因此如果您严格需要相同的号码,您将需要 "time converter" 检查时间是否合适,因为时差。

倒计时结束后你应该clearInterval(intervalID);

就 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/

希望对您有所帮助。