我正在使用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。看到一个错误的答案,我想澄清一下。我知道如何向房间里的人发送信息。我想解决另一个问题。如果用户输入Room1
,Room2
,...
,RoomN
然后断开连接,我想向这些N
会议室中的所有人发送消息。
答案 0 :(得分:2)
您可以使用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);
答案 1 :(得分:0)
根据documentation,您可以使用socket.to('room name').emit(...)
或socket.in('room name').emit(...)
。使用这些方法,您将向会议室中的所有客户广播该事件:
为后续事件发射设置一个修饰符,该事件将仅被广播到&gt;已加入指定房间的插座。
示例:
io.on('connection', function(socket){
socket.to('room').emit('an event', 'leaving the room, goodbye');
});
这是由本机socket.io API实现的。但是,有一些有用的常见功能必须在lib之上实现。您可能需要查看socket.io-hotel模块以获取一些额外功能。