【发布时间】:2015-05-08 01:10:09
【问题描述】:
我正在使用 socket.io 1.3.5。客户可以通过发送join 消息加入房间。服务器端代码:
socket.on('join', function(room) {
socket.join(room);
});
现在我想确保客户一次只能在一个房间内。我希望客户在加入新房间时自动离开当前房间。这是我的方法:
function leaveAllRooms(socket) {
var rooms = socket.adapter.sids[socket.id];
Object.keys(rooms).forEach(function(room) {
if (room != socket.id) {
socket.leave(room);
}
});
}
socket.on('join', function(room) {
leaveAllRooms(socket);
socket.join(room);
});
每当客户想要加入房间时,我都会调用leaveAllRooms,它会为socket.adapter.sids[socket.id] 中找到的所有房间调用socket.leave(),除了套接字自己的房间。
这个解决方案似乎运作良好,但我不确定它是否正确。在another post's comment 中提到可以使用io.sockets.manager.roomClients[socket.id](而不是我的socket.adapter.sids[socket.id])。我不知道哪个更好。某处是否有关于此的文档?我发现socket.io 的文档很少。
此外,我想知道这个解决方案是否适用于命名空间,甚至是通过 Redis 连接的多个 socket.io 实例。有什么建议吗?
【问题讨论】: