2

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

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

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

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

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

4

2 回答 2

2

Socket#rooms您可以使用对象(文档)找到客户端连接到的所有房间:

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);
于 2014-07-26T17:59:08.023 回答
0

根据文档,您可以使用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模块以获得一些额外的功能。

于 2014-07-26T16:08:31.350 回答