Socket.IO向多个房间发送消息

5

我在我的Node Express应用程序中使用Socket.IO,并使用这篇出色的文章中描述的方法来关联我的socket连接和会话。在评论中,作者描述了一种向特定用户(会话)发送消息的方法,如下所示:

sio.on('connection', function (socket) {
    // do all the session stuff
    socket.join(socket.handshake.sessionID);
    // socket.io will leave the room upon disconnect
});

app.get('/', function (req, res) {
    sio.sockets.in(req.sessionID).send('Man, good to see you back!');
});

看起来是个好主意。然而,在我的应用程序中,我经常会向多个用户同时发送消息。我在想如何在Socket.IO中以最佳性能发送消息到多个房间 - 实际上,我需要向多个房间发送消息。有什么建议吗?


你找到一个好的方法来做到这一点了吗(向群组/聊天室中不同的用户发送相同的消息)? - Huzaifa
1个回答

8

两个选择:使用socket.io频道或socket.io命名空间。它们都在socket.io网站上有文档,但简而言之:

使用频道:

// all on the server
// on connect or message received
socket.join("channel-name");
socket.broadcast.to("channel-name").emit("message to all other users in channel");

// OR independently
io.sockets.in("channel-name").emit("message to all users in channel");

使用命名空间:

// on the client connect to namespace
io.connect("/chat/channel-name")

// on the server receive connections to namespace as normal
// broadcast to namespace
io.of("/chat/channel-name").emit("message to all users in namespace")

因为socket.io足够聪明,不会为额外的命名空间打开第二个套接字,所以两种方法在效率上应该是可比较的。

4
我认为这些与我已经在做的标识每个用户的工作是等效的。也就是说,每个用户根据他的会话密钥获得自己的socket.io通道,并且我通过该通道广播以发送给该用户(而不仅仅是直接在一个socket上发射)。所以我的问题是:如果这些用户中的两个(每个都表示一个房间)需要接收相同的消息,是否有有效的方法来实现这一点? - Joel
3
最后一段应该是 "io.of('/chat/channel-name')",请问是否正确? - dansch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接