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 应用程序中应该会出现两个玩家的倒计时。对我来说,重要 他们在屏幕上同时看到相同的号码。准确地说,它应该 运行 同步。我该怎么做?
我申请了,遇到了同样的问题。在那种情况下,我解决了将时间控制留给服务器的问题。服务器发送给客户端,客户端增加时间。也许在您的情况下,您可能会遇到连接问题。如果问题存在,您可以让客户自己增加时间,有时发送带有正确同步时间的标记。
我可以给你类似下面的东西,但我没有经过测试。
此解决方案包含以下步骤:
- 同步
client
和 server
的计时器。所有用户都具有相同的 difference
和服务器计时器。
- 对于所需的
response/request
获取客户端时间并找到带有服务器时间的 differences
。
- 将
smallest
视为将要开始的第一个倒计时。
- 对于每个
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/
希望对您有所帮助。
在我的服务器上我同时调用了两个 emits,看起来像这样。
if (songs.length > 0) {
socket.emit('data loaded', songs);
socket.broadcast.to(opponent).emit('data loaded', songs);
}
一个给对手一个给自己.
加载数据后,我的 android 应用程序中应该会出现两个玩家的倒计时。对我来说,重要 他们在屏幕上同时看到相同的号码。准确地说,它应该 运行 同步。我该怎么做?
我申请了,遇到了同样的问题。在那种情况下,我解决了将时间控制留给服务器的问题。服务器发送给客户端,客户端增加时间。也许在您的情况下,您可能会遇到连接问题。如果问题存在,您可以让客户自己增加时间,有时发送带有正确同步时间的标记。
我可以给你类似下面的东西,但我没有经过测试。 此解决方案包含以下步骤:
- 同步
client
和server
的计时器。所有用户都具有相同的difference
和服务器计时器。 - 对于所需的
response/request
获取客户端时间并找到带有服务器时间的differences
。 - 将
smallest
视为将要开始的第一个倒计时。 - 对于每个
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/
希望对您有所帮助。