【问题标题】:nodejs timer on server服务器上的nodejs计时器
【发布时间】:2018-08-10 20:28:58
【问题描述】:

我是 nodejs 的新手。我打算开发一个游戏的服务器端,每个玩家都有一个固定的时间,当轮到他/她时,剩余的时间应该开始倒计时,直到他/她提交他/她的选择。

我们无法在客户端处理此问题,因为用户可能会在一段时间后关闭应用程序(或断开与互联网的连接或关闭设备),而我们没有他/她经过的时间和他/她返回的时间,他/她会在服务器中看到他/她上次保存的时间,这是不正确的。

另一种选择是每隔 15 秒将客户端与服务器同步一次,这可以以某种方式解决问题,但在某些情况下,时间不会完全正确。我们的游戏高度依赖时间。此外,我猜它会在服务器上产生很多过载和来自客户端的许多请求。

第三种选择是为服务器中的每个玩家设置计时器,这会给服务器带来额外且繁重的负载,并且节点是单线程,这使得该选项无法实现。

什么是最好的解决方案? tnx


更新

  1. 我忘了说对于用户匹配,我使用套接字。

  2. 另一点是我们知道用户什么时候玩(我们确定时间),甚至知道玩家的数量。我的意思是,我们面对很多用户上网和一起玩是不可能的。我们知道在晚上 8 点到 8:30 之间,最多有 60 名玩家在线。

  3. 这个问题很重要,因为每个用户断开连接的时间有限。我的意思是无论您有多少剩余时间,您都必须在 1 分钟后重新连接。如果你不回来,你就迷路了。此外,整个时间都断开连接是对您剩余时间的惩罚。我的意思是,如果你有 80 秒并断开连接 50 秒,那么你的剩余时间现在是 30 秒。

【问题讨论】:

  • 你在使用套接字吗?问候。
  • 是的,我忘了说。

标签: javascript node.js


【解决方案1】:

为什么不只存储用户开始测验/游戏的时间,然后当用户完成测验时,获取当前时间并计算所用时间为end - start。现在在客户端你可以只请求一次开始时间,然后根据它显示倒计时。

【讨论】:

  • 假设你和我在玩,你还有 30 秒的时间,而你根本没有提交,服务器应该意识到 30 秒后你的时间到了。另一个原因是我在更新中的第三个选项
  • @hsbr13 要么:客户端 ping 服务器 10 秒左右,然后你更新回合,或者你只是 setTimeout(cancel, 30 * 1000)
【解决方案2】:

你应该详细说明。

这是1v1的“战斗”吗?如果一个玩家做了某事,第二个玩家是否需要尽快知道这件事发生了?

如果是这样,并且如果您不需要每隔几毫秒发送一些数据(看起来您不需要),我认为托管解决方案应该最适合您,因此您不必关心一些超时、断开连接等等

您可以使用即 Firebase:https://firebase.google.com/docs/database/

每个玩家都在 firebase 的客户端监听,因此每个更改都会立即传播给其他玩家。对它的主动更改应该通过向您的服务器发送请求来完成,然后服务器会修改 Firebase。此外,它还允许任何断开连接的人轻松重新连接,并且您可以获得所有匹配历史记录。

还要考虑未来 - 您可以拥有多个服务器,每个请求都可以发送到不同的服务器。您需要一个事实来源(数据库)——它可以是 Firebase、Redis、Mongo ......满足您的需求。

除了活动服务器之外,您还应该有 cron 服务器(它可以是相同的代码库,但部署不同)应该检查,即每秒检查所有未完成的游戏,如果一切正常则继续,或者让一个玩家输掉,如果他太久没有回复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多