客户端之间的区别Date.now()

时间:2020-05-20 14:09:49

标签: javascript timer timestamp

我想向所有用户显示相同的计时器值。服务器启动计时器时,他将倒计时结束日期发送给客户。

struct 服务器生成完成时间并将其提供给客户端;

typedef 客户端每秒钟进行一次计算,以获取时间直到计时器结束;

但是客户获得了不同的clients.broadcast({ timerFinish: Date.now() + 5000 })价值!服务器也有所不同。
如何更好地实现此计时器?

3 个答案:

答案 0 :(得分:2)

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

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

const now = Date.now();
clients.broadcast({ now, timerFinish: now + 5000 });

然后,客户端可以计算服务器时间与其时间之间的时差并使用该信息。

这不允许传输时间,但是在大多数情况下,它将“足够好”。如果需要允许传输时间,则需要在客户端和服务器之间进行多次往返以确定它们的网络时间统计平均值(由于这些因素的变化,这对于任何单独的交换可能都是不正确的,但只有你可以做的很多。)

要真正准确,您可以研究网络时间协议(NTP)的工作原理并对其进行仿真。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这可能是因为将消息发送给每个客户端需要花费时间,因此最终时间将取决于每个客户端从服务器发送消息的速度而定。

您确定serverData.timerFinish对于每个用户都是不同的,还是仅仅是最终的计算serverData.timerFinish - Date.now()与开始时不同?

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

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