使用 Socket.io 为不同房间设置不同计时器

nOp*_*nOp 2 websocket node.js socket.io

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

我正在使用 WebSockets (Socket.io) 房间进行扑克游戏项目。

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

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

Luk*_*non 5

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

这是一个通用示例:

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();
Run Code Online (Sandbox Code Playgroud)

  • @nOp 没问题!仅当您需要永久存储数据,以便以后可以访问或由其他服务器访问时,才使用 MongoDB。任何临时数据都可以仅存在于变量中(例如对象结构中)。即使您确实将数据存储在数据库中,您仍然需要存储该数据以供在代码中使用。顺便说一句,您可能需要将这些对象存储在数组中。就开销而言,您可以处理的房间数量取决于您编写代码的程度以及运行代码的计算机的性能(以及其他因素)。 (2认同)