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

时间:2014-07-26 09:14:50

标签: socket.io socket.io-1.0

我正在使用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会议室中的所有人发送消息。

2 个答案:

答案 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模块以获取一些额外功能。