socket.io获取socket当前所在的房间

时间:2013-09-27 07:04:11

标签: node.js websocket socket.io

是否可以获得套接字当前所在的房间,而无需致电

io.sockets.clients(roomName)

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

12 个答案:

答案 0 :(得分:28)

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

socket.rooms

答案 1 :(得分:9)

来自Socket.IO Room doc

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

答案 2 :(得分:5)

socket.io 1.7.3 + - >

Object.keys( io.sockets.adapter.sids[socket.id] )
// returns [socket.id, room-x'] || [socket.id, 'room-1', 'room-2', ...]

答案 3 :(得分:2)

使用非默认适配器时,例如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

答案 4 :(得分:2)

版本1.7.3,socket.rooms包含socket.id,因此请将其删除并获取会议室列表:

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

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

答案 5 :(得分:1)

版本2.0.3

io.sockets.sockets[yourSocketID].rooms

相等
socket.rooms

答案 6 :(得分:1)

确保套接字一次只在一个房间内,我的解决方案是:

var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);

答案 7 :(得分:1)

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)

答案 8 :(得分:0)

socket.io 1.7.3 +

var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room

答案 9 :(得分:0)

加入房间时,您可以在插座中节省空间

// join room
socket.join(room);

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

稍后您可以通过

检索套接字所在的所有房间
socket.rooms

从Server API文档:

  

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

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

答案 10 :(得分:0)

更新:Socket.io 3.0已发布


现在3.x的Socket.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/

答案 11 :(得分:-1)

1.4.5版本=&gt; io.sockets.adapter.rooms[roomname].sockets