服务器上的nodejs计时器

时间:2018-08-10 12:07:56

标签: javascript node.js

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

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

另一种选择是例如每15秒同步一次客户端与服务器,这可以通过某种方式解决问题,但是在某些情况下,时间可能并不完全正确。我们的游戏高度依赖时间。而且,我想这会在服务器上产生很多过载,并从客户端发出许多请求。

第三个选项是为服务器中的每个播放器设置计时器,这会在服务器上增加额外的负担,并且节点是单线程的,因此无法使用此选项。

什么是最佳解决方案? tnx


更新

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

  2. 另一点是我们知道用户何时玩(我们确定时间),甚至是玩家数量。我的意思是,我们面对许多用户上网并共同玩乐是不可能的。我们知道,在晚上8点至8:30,最多有60位玩家在线。

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

2 个答案:

答案 0 :(得分:2)

为什么不仅仅存储用户开始测验/游戏的时间,而是为什么当用户完成测验/游戏时,获取当前时间并计算花费的时间为// Inline SpeedMeter functions class SpeedMeter { int speed; public: int getSpeed() const { return speed; } void setSpeed(int varSpeed) { speed = varSpeed; } }; int main() { SpeedMeter objSM; objSM.setSpeed(80); int speedValue = A.getSpeed(); } 。现在,在客户端,您只需请求一次开始时间,然后根据该时间显示倒计时。

答案 1 :(得分:2)

您应该详细说明。

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

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

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

每个玩家都在Firebase的客户端进行侦听,因此所有更改都会立即传播给其他玩家。对其的有效更改应通过将请求发送到服务器来进行,然后服务器对Firebase进行修改。此外,它还使断开连接的任何人都可以轻松地重新连接,从而获得所有匹配的历史记录。

还要考虑未来-您可以拥有多个服务器,每个请求都可以发送到其他服务器。您需要一个事实来源(数据库)-可以是Firebase,也可以是Redis,Mongo ...适合您的需求。

在活动服务器旁边,您应该拥有cron服务器(它可以是相同的代码库,但是部署不同),应每秒检查所有未完成的游戏,如果一切正常,请继续进行操作;如果一个玩家失败,则让一个玩家输掉没有回答太久。