使用 socket.io 管理多个聊天室的正确方法是啥?

Posted

技术标签:

【中文标题】使用 socket.io 管理多个聊天室的正确方法是啥?【英文标题】:What is the proper way to manage multiple chat rooms with socket.io?使用 socket.io 管理多个聊天室的正确方法是什么? 【发布时间】:2011-10-06 23:26:39 【问题描述】:

使用 socket.io 管理多个聊天室的正确方法是什么?

所以在服务器上会有类似的东西:

io.sockets.on('connection', function (socket) 
  socket.on('message', function (data) 
    socket.broadcast.emit('receive', data);
  );
);

现在这对于一个房间来说可以正常工作,因为它会将消息广播给所有连接的人。但是,您如何向特定聊天室中的人发送消息?

添加 .of('/chat/room_name')? 或者在一个房间里存储一个数组?

【问题讨论】:

【参考方案1】:

Socket.IO v0.7 现在为您定义的每个命名空间提供一个 Socket

var room1 = io.connect('/room1');
room1.on('message', function () 
    // chat socket messages
);
room1.on('disconnect', function () 
    // chat disconnect event
);

var room2 = io.connect('/room2');
room2.on('message', function () 
    // chat socket messages
);
room2.on('disconnect', function () 
    // chat disconnect event
);

使用不同的套接字,您可以有选择地发送到您想要的特定命名空间。

Socket.IO v0.7 也有“房间”的概念

io.sockets.on('connection', function (socket) 
  socket.join('a room');
  socket.broadcast.to('a room').send('im here');
  io.sockets.in('some other room').emit('hi');
);

来源:http://socket.io/#announcement

【讨论】:

谢谢,我认为第二个示例是我正在寻找的,因为房间是动态创建的。所以可以说我有两个部分,聊天和群组。我会做 io.connect('/chat OR /group') 并让 socket.join('GROUP OR CHAT ID') 连接到特定的群组或聊天吗? 我相信是的。第一个允许您订阅不同的频道,第二个为您提供一个简单的房间概念,您可以将不同的套接字分组。【参考方案2】:

更新:Now.js 和 Bridge 现在都死了,请参阅 now.js dead 和 bridge dead。 Socket.io 似乎从 v0.9 开始采用了回调功能,这是向前迈出的一大步。

虽然它与 Socket.io 没有直接关系,但 Now.js(Socket.io 之上的更高级别抽象)支持组 - http://nowjs.com/doc

他们在官方仓库中有一个多房间聊天示例:https://github.com/Flotype/now/blob/master/examples/multiroomchat_example/multiroomchat_server.js

【讨论】:

那个项目可能已经死了,网页是 404,最后一次提交是一年前。

以上是关于使用 socket.io 管理多个聊天室的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

允许多个用户加入聊天室(使用 Django、Socket.io 和 node.js)

递归删除多个 socket.io 监听器

socket.io 在一页上进行多个聊天

使用 socket.io 防止向多个房间发送消息

Socket.io:如何正确加入和离开房间

Socket.IO 订阅多个频道