【问题标题】:Different timers for different rooms using Socket.io使用 Socket.io 为不同房间设置不同的计时器
【发布时间】:2018-05-04 08:07:48
【问题描述】:

我发现了另外 3 篇关于为回合制游戏实现计时器的帖子,但没有一篇给出最终答案。

我正在开发一个使用 WebSockets (Socket.io) 房间的扑克游戏项目。

每个房间都有一个计时器,负责处理服务器的回合,例如,每个玩家有 10 秒的时间来选择一张牌。如果只有一个房间,我可以通过使用 setInterval 并在每个间隔结束时更改轮次变量并将新轮次发送给客户端来做到这一点。

但是现在,考虑到 node.js 是单线程的,当有很多房间时,我很困惑如何为每个房间实现特定的计时器。

【问题讨论】:

    标签: node.js websocket socket.io


    【解决方案1】:

    尽管是单线程的,Node.js 可以同时管理多个计时器。你可以设置它们。你怎么做取决于你。请记住,如果您使用对象管理 Rooms,则需要使用 bind。您可以使用变量来管理(例如,取消)您的计时器。

    这是一个通用示例:

    var Room = function() {
      this.id = String(Date.now());
      this.timer = setInterval(this.timerFunction.bind(this), 10000);
    }
    
    Room.prototype.timerFunction = function() {
      // Example
      io.to(this.id).emit("some message");
    }
    
    // Create one
    new Room();
    

    【讨论】:

    • 谢谢,太好了!我现在有一个题外话的问题。将房间的所有信息(如玩家姓名、回合数和回合数)保存在上面示例中的 Room 等类中是否安全?服务器的开销是不是太大了?我还需要将这些数据保存在 mongodb 中吗?
    • @nOp 没问题!仅当您需要永久存储数据时才使用 MongoDB,这些数据可以稍后访问或由其他服务器访问。任何临时数据只存在于变量中(例如对象结构中)是可以的。即使您确实将数据存储在数据库中,您仍然需要存储该数据以在代码中使用。顺便说一句,您可能需要将这些对象存储在一个数组中。就开销而言,您可以处理的房间数量取决于您编写代码的程度以及运行代码的计算机的性能(以及其他因素)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2012-08-28
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多