24

是否可以在不调用的情况下获取当前套接字所在的房间

io.sockets.clients(roomName)

对于每个房间名称并在结果中查找此套接字

4

11 回答 11

41

在 socket.io 版本 1+ 中,语法是:

socket.rooms
于 2015-02-13T09:20:17.647 回答
13

交叉兼容方式

var rooms = Object.keys(io.sockets.adapter.sids[socket.id]);
// returns [socket.id, 'room-x'] or [socket.id, 'room-1', 'room-2', ..., 'room-x']
于 2017-03-06T18:04:49.140 回答
12

来自Socket.IO Room 文档

io.sockets.manager.roomClients[socket.id]

于 2013-09-27T11:32:15.683 回答
9

更新:Socket.io 3.0 发布


现在有了3.xSocket.rooms Set,这意味着房间中的值可能只出现一次

结构示例:Set(4) {"<socket ID>", "room1", "room2", "room3"}

io.on("connect", (socket) => {
  console.log(socket.rooms); // Set { <socket.id> }
  socket.join("room1");
  console.log(socket.rooms); // Set { <socket.id>, "room1" }
});

检查特定房间:

socket.rooms.has("room1"); // true

有关 Set 和可用方法的更多信息:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

迁移文档:https ://socket.io/docs/migrating-from-2-x-to-3-0/

于 2020-11-06T22:17:02.603 回答
4

当使用非默认适配器时,例如 socket.io-redis,socket.rooms似乎并不能解决问题。我设法在不循环的情况下为特定客户端获取房间的方法是使用io.sockets.adapter.sids[socket.id],它将房间作为对象返回。

{ 'R-ZRgSf7h4wfPatcAAAC': true, ROOM: true, ROOM_2: true }

请注意,这并没有列出其他进程上的套接字!

socket.io v1.3.7,socket.io-redis 1.0.0

于 2015-12-19T13:41:08.387 回答
2

Socket.io v2.1.1

因此,请确保您没有disconnect像我一样在事件中访问套接字房间,因为在触发该事件时它们已经离开了房间。如果您想这样做,请在disconnecting活动中尝试 - https://github.com/socketio/socket.io/pull/2332/files

然后,您可以使用以下任何一种:

Object.keys(socket.adapter.rooms)
Object.keys(socket.adapter.sids)
Object.keys(socket.rooms)
于 2018-10-09T05:36:34.237 回答
2

版本 1.7.3,socket.rooms包含socket.id,因此删除它并获取房间列表:

Object.keys(socket.rooms).filter(item => item!=socket.id);

在其他版本中,您可以打印socket并找到房间。

于 2017-04-02T07:56:22.310 回答
1

确保插座一次只在一个房间里,我的解决方案是:

var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);
于 2017-12-02T15:32:13.307 回答
1

版本 2.0.3

io.sockets.sockets[yourSocketID].rooms

那等于

socket.rooms
于 2017-07-15T11:29:52.467 回答
0

当它加入房间时,您可以在套接字本身中保存空间

// join room
socket.join(room);

// update socket's rooms
if (socket.rooms) {
    socket.rooms.push(room);
} else {
    socket.rooms = [room];
}

稍后您可以通过简单地检索套接字所在的所有房间

socket.rooms

从服务器 API 文档:

socket.rooms (object)
标识此客户端所在房间的字符串哈希,按房间名称索引。

https://socket.io/docs/server-api/#socket-rooms

于 2017-11-09T11:50:05.177 回答
0

socket.io 1.7.3 +

var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room
于 2017-03-12T21:16:50.437 回答