【发布时间】:2013-10-03 09:22:54
【问题描述】:
是否可以在不调用的情况下获取当前套接字所在的房间
io.sockets.clients(roomName)
每个房间名称并在结果中查找此套接字
【问题讨论】:
标签: node.js websocket socket.io
是否可以在不调用的情况下获取当前套接字所在的房间
io.sockets.clients(roomName)
每个房间名称并在结果中查找此套接字
【问题讨论】:
标签: node.js websocket socket.io
在 socket.io 版本 1+ 中,语法是:
socket.rooms
【讨论】:
socket.rooms 在 1.3.6 中显示为空白...这仍然对您有用吗?
undefined,版本:1.6.0。
{},我使用的是2.3.0
socket.join(),它也会返回一个等于套接字ID 的通道。也许您没有在连接函数中调用它?或者你的连接函数有socket以外的参数?
var rooms = Object.keys(io.sockets.adapter.sids[socket.id]);
// returns [socket.id, 'room-x'] or [socket.id, 'room-1', 'room-2', ..., 'room-x']
【讨论】:
io.sockets.manager.roomClients[socket.id]
【讨论】:
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
【讨论】:
当使用 非默认适配器 时,例如 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
【讨论】:
版本 1.7.3,socket.rooms 包含 socket.id,所以删除它并获取房间列表:
Object.keys(socket.rooms).filter(item => item!=socket.id);
在其他版本中,您可以打印socket 并找到房间。
【讨论】:
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)
【讨论】:
socket.id 字符串来查找套接字所在的房间?即不使用传递给事件的socket,而只是使用包含socket.id的字符串?
2.0.3 版
io.sockets.sockets[yourSocketID].rooms
等于
socket.rooms
【讨论】:
确保插座一次只能在一个房间中,我的解决方案是:
var currentRoom = Object.keys(io.sockets.adapter.sids[socket.id]).filter(item => item!=socket.id);
【讨论】:
socket.io 1.7.3 +
var currentRoom = socket.rooms[Object.keys(socket.rooms)[0]];//returns name of room
【讨论】:
Object.keys 没有排序,是吗?我认为这个解决方案一般都行不通。
当它加入一个房间时,你可以在套接字本身中保存空间
// 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 (对象)
标识此客户所在房间的字符串哈希,按房间名称索引。
【讨论】:
socket.rooms 不会在每次套接字加入房间时由socket.io 自动更新吗?