向客户端连接的所有房间发送消息

Posted

技术标签:

【中文标题】向客户端连接的所有房间发送消息【英文标题】:Send a message to all rooms a client is connected to 【发布时间】:2014-09-18 02:50:13 【问题描述】:

我使用的是 socket.io 版本 1,但遇到以下问题。

我有一个应用程序,用户可以在其中连接到不同的房间。在断开连接事件时,我希望该用户通知他离开了他连接的房间。 (我知道在断开连接时用户会自动离开所有房间,但我想通知其他人用户离开了他们。)

我查看了this list 并没有找到一种简单的方法来做我想做的事。可能有更好的方法来做到这一点,但目前我的解决方案是找到所有房间并循环发送给每个房间的所有人。但是io.sockets.manager 和适配器都不能给我一个客户端连接的房间列表。

client.on('disconnect', function() 
   // io.sockets.manager.roomClients[client.id];
   // io.sockets.adapter.roomClients[client.id];
);

P.S. 看到一个错误的答案,我想澄清一下。我知道如何向房间里的人发送消息。我想解决另一个问题。如果用户输入Room1Room2...RoomN 然后断开连接,我想向这些N 房间中的所有人发送消息。

【问题讨论】:

【参考方案1】:

您可以通过Socket#rooms 对象 (documentation) 找到客户端连接到的所有房间:

io.on('connection', function(socket) 
    //...
    console.log(socket.rooms);
);

然后,您可以轻松地循环向每个房间发送消息。

警告: socket.join 方法是异步的,所以如果你有类似的东西:

socket.join('my room name');
console.log(socket.rooms);

它不会按预期工作。相反,你应该写:

socket.join('my room name', function() 
    console.log(socket.rooms);
);

编辑:

如果你想得到一个数组而不是对象,你可以这样做:

Object.keys(socket.rooms);

【讨论】:

不幸的是,在本文发布时,文档站点已关闭。无论您参考的文档是否已过时。当前的socket.rooms 似乎是一个对象而不是一个数组。但是,我们(可能)将来也会将socket._rooms 作为一个数组,尽管现在还不到一个月,来自current source。 socket.rooms 已成为 over a year 的对象。 @Nolo 是的,这是一个对象,在撰写本文时它是一个对象。谢谢你的提示。我编辑了我的帖子以使其更清晰【参考方案2】:

根据documentation,您可以使用socket.to('room name').emit(...)socket.in('room name').emit(...)。使用这些方法,您将向房间中的所有客户广播事件:

为随后的事件发射设置一个修饰符,该事件只会被广播到 > 已加入给定房间的套接字。

示例:

io.on('connection', function(socket)
  socket.to('room').emit('an event', 'leaving the room, goodbye');
);

这是由本机 socket.io API 实现的。但是,有一些有用的通用功能必须在 lib 之上实现。您可能想查看socket.io-hotel 模块的一些额外功能。

【讨论】:

我想你还没有读过这个问题。我知道如何向房间里的所有人发送消息。如果客户进入 Room1、Room2、Room3,我想将消息发送给这些房间中的所有人。 好的,所以检查客户端连接的所有房间 socket.rooms 应该是解决方案。 CuriousGuy 已经回答了。 所以您能否删除您的答案,因为它没有回答问题?

以上是关于向客户端连接的所有房间发送消息的主要内容,如果未能解决你的问题,请参考以下文章

向所有连接的客户端/资源发送 xmpp 消息

向 Socket.io 中的其他房间发送消息

Socket.io 不会在断开连接时向房间发送消息

Nodejs如何将消息广播到带有房间的命名空间

如何在 Qt 中从服务器向连接的客户端发送消息

如何将 socket.io 挂载到 fastapi 应用程序并向所有连接的客户端发送广播