我可以在 socket.io 的命名空间中使用房间吗

Posted

技术标签:

【中文标题】我可以在 socket.io 的命名空间中使用房间吗【英文标题】:Can I use rooms in namespaces in socket.io 【发布时间】:2015-07-21 23:08:21 【问题描述】:

我想知道我是否可以在 socket.io 中使用多个带有命名空间的房间。

据我所知,您可以使用命名空间或房间。

我的目的是让我的应用程序的多个唯一实例通过 websockets 与具有此唯一应用程序的其他实例进行通信,并且只有一个 node.js-socket.io-server。

有了这个应用程序,就需要互相交谈。无论是在房间内还是在全球范围内。无需与另一个命名空间对话。

提前致谢,

丹尼尔

【问题讨论】:

【参考方案1】:

我这样做没有问题。我有一些自己构建的多人游戏 (see here),它们都在同一个 socket.io 实例上运行。命名空间将不同的游戏分开,房间将单个游戏中的各个游戏房间分开。

此处的完整代码示例: https://github.com/azurelogic/CakeRush/blob/master/controllers/cakerush.js

重点是我在连接上使用命名空间:

io.of('/sockets/cakerush').on('connection', function (socket)  //...

然后,我允许用户通过“加入房间”事件加入房间:

socket.on('joinRoom', function (data) 
  // find the room being requested
  var room = _.find(rooms, id: data.roomId);

  /* skip some logic here... */

  // register player with room
  room.playerIds.push(socket.id);
  socket.join(room.id);  
  // send verification that room was joined to the player with room id
  socket.emit('roomJoined', roomId: room.id, shouldGenerateFirstCake: shouldGenerateFirstCake);
);

【讨论】:

非常感谢@azurelogic 的回答。不过我接受了它,因为你给了我一个很好的解释和一些代码:) 你能告诉我 node.js-server 的性能如何吗?我可能会获得数百个名称空间和拥有更多用户的房间。 不幸的是,我从来没有机会真正对其进行负载测试。我在小型服务器(1 核,512 MB RAM)上运行它,没有任何问题。我将它设计为一​​个独立的 node.js 进程,与一些静态文件一起在 nginx 后面运行,从而将其他服务器的负载降至最低。我希望这会有所帮助! 再次感谢 @azurelogic 提供此信息。我的项目完成后我会报告。我将对其进行一些负载测试以确定我的瓶颈在哪里。

以上是关于我可以在 socket.io 的命名空间中使用房间吗的主要内容,如果未能解决你的问题,请参考以下文章

如何在socket.io中发射到房间? [复制]

通过 Socket.IO 的 WebSocket 设计模式

动态命名空间 Socket.IO

在 MEAN.js 4.2 中使用 Socket.io 命名空间

使用 socket.io-client.java 库连接到 socket.io 命名空间

Socket.io 命名空间限制以及如何扩展它