Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 客户端日期之间的差异。现在()_Javascript_Timer_Timestamp - Fatal编程技术网

Javascript 客户端日期之间的差异。现在()

Javascript 客户端日期之间的差异。现在(),javascript,timer,timestamp,Javascript,Timer,Timestamp,我想向所有用户显示相同的计时器值。当服务器启动计时器时,他向客户端发送倒计时完成日期。 clients.broadcast({timerFinish:Date.now()+5000})服务器生成完成时间并将其提供给客户端 timeLeft=serverData.timerFinish-Date.now()客户端每秒计算一次时间,直到计时器完成; 但是客户端得到了不同的Date.now()value!服务器也有区别。如何更好地实现此计时器?大概在这种情况下,服务器的时钟会赢得任何争议 在这种情况

我想向所有用户显示相同的计时器值。当服务器启动计时器时,他向客户端发送倒计时完成日期。

clients.broadcast({timerFinish:Date.now()+5000})
服务器生成完成时间并将其提供给客户端

timeLeft=serverData.timerFinish-Date.now()
客户端每秒计算一次时间,直到计时器完成;


但是客户端得到了不同的
Date.now()
value!服务器也有区别。
如何更好地实现此计时器?大概在这种情况下,服务器的时钟会赢得任何争议

在这种情况下,还要将服务器的时间发送到客户端:

const now = Date.now();
clients.broadcast({ now, timerFinish: now + 5000 });
然后,客户机可以计算服务器的时间和他们的时间之间的差异,并使用这些信息

这不考虑传输时间,但在大多数情况下,这将“足够好”。如果需要考虑传输时间,则需要在客户端和服务器之间进行多次往返,以确定网络时间的统计平均值(这对于任何个人交换来说都可能是不正确的,因为这些事情各不相同,但你能做的只有这么多)


要想真正做到这一点,您可以研究网络时间协议(NTP)是如何工作的,并对此进行一点模拟。

大概在这种情况下,服务器的时钟会赢得任何争议

在这种情况下,还要将服务器的时间发送到客户端:

const now = Date.now();
clients.broadcast({ now, timerFinish: now + 5000 });
然后,客户机可以计算服务器的时间和他们的时间之间的差异,并使用这些信息

这不考虑传输时间,但在大多数情况下,这将“足够好”。如果需要考虑传输时间,则需要在客户端和服务器之间进行多次往返,以确定网络时间的统计平均值(这对于任何个人交换来说都可能是不正确的,因为这些事情各不相同,但你能做的只有这么多)


要想真正做到这一点,您可以研究网络时间协议(NTP)是如何工作并模拟一点。

如果您使用的有状态服务器为所有连接的客户端维护相同的计数器,那么为什么不在服务器上倒计时一次并将结果值发送给所有客户端。这也将消除某些客户端可能存在的任何延迟。

如果您使用的有状态服务器为所有连接维护相同的计数器cted客户端,那么为什么不在服务器上倒计时一次,并将结果值发送给所有客户端。这也将消除某些客户端可能存在的任何延迟。

这可能是因为将消息发送到每个客户端需要时间,因此每个客户端的最后时间将取决于从服务器发送消息的速度

您确定每个用户的
serverData.timerFinish
都不同,还是只是最后的计算
serverData.timerFinish-Date.now()
的开始不同

无论如何,要解决这个差异并对其进行测试,请尝试将Date.now()从服务器发送到每个客户端,然后查看它们是否从服务器获得相同的值(它们应该)


我认为问题在于,当它稍后与客户端的
日期混合时,现在
,因此您需要计算从广播到接收所花费的时间,因此当您在客户端接收它时,只需将它(立即,在其他时间之前)设置为
(Date.now()-(timerFinish-5000))+5000
(或者更好的做法是从服务器发送Date.now(),稍后再添加5000),以修复差异。

这可能是因为将消息发送到每个客户端需要时间,因此每个客户端的最后时间将更晚,具体取决于从服务器发送消息的速度

您确定每个用户的
serverData.timerFinish
都不同,还是只是最后的计算
serverData.timerFinish-Date.now()
的开始不同

无论如何,要解决这个差异并对其进行测试,请尝试将Date.now()从服务器发送到每个客户端,然后查看它们是否从服务器获得相同的值(它们应该)


我认为问题在于,当它稍后与客户端的
日期混合时,现在
,因此您需要计算从广播到接收所花费的时间,因此当您在客户端接收它时,只需将它(立即,在其他时间之前)设置为
(Date.now()-(timerFinish-5000))+5000
(或者最好从服务器发送Date.now()并在以后添加5000),以解决差异。

我需要知道websocket延迟。每10秒向服务器发送ping消息并计算延迟是否是一种好的做法?@car1ot-我恐怕这不是我的专长。不过,我想您的移动客户端可能会抱怨数据使用情况。:-)嗯,我需要知道websocket延迟。每隔10秒从客户端向服务器发送ping消息并计算延迟是一种好做法吗?@car1ot-恐怕这不是我的专业知识。不过,我想您的移动客户端可能会抱怨数据使用情况。:-)