我可以在socket.io 0.9中使用此代码获取会议室的客户列表。
io.sockets.clients(roomName)
我如何在socket.io 1.0中执行此操作?
答案 0 :(得分:36)
请考虑以上关于问题的评论中相关更完整的答案:https://stackoverflow.com/a/24425207/1449799
客房内的客户可以在
找到io.nsps[yourNamespace].adapter.rooms[roomName]
这是一个关联数组,其键是套接字ID。在我们的例子中,我们想知道一个房间里的客户数量,所以我们做了Object.keys(io.nsps[yourNamespace].adapter.rooms[roomName]).length
如果你没有看到/使用过名字空间(比如这个人[我]),你可以在这里了解它们http://socket.io/docs/rooms-and-namespaces/ (重要的是:默认名称空间是'/')
更新(特别是@Zettam):
结帐此代表以查看此工作:https://github.com/thegreatmichael/socket-io-clients
答案 1 :(得分:11)
使用@ryan_Hdot link,我在代码中创建了一个小的临时函数,这样可以避免维护补丁。这是:
function getClient(roomId) {
var res = [],
room = io.sockets.adapter.rooms[roomId];
if (room) {
for (var id in room) {
res.push(io.sockets.adapter.nsp.connected[id]);
}
}
return res;
}
如果使用命名空间:
function getClient (ns, id) {
return io.nsps[ns].adapter.rooms[id]
}
我将io.sockets.clients(roomId)
用作findClientsSocketByRoomId(roomId)
的临时修复程序。
编辑:
大多数情况下,如果可能,请考虑避免使用此方法。
我现在所做的是,我通常把一个客户放在它自己的房间里(即在一个房间,其名称是它的clientID)。我发现代码更具可读性,我不再需要依赖此解决方法了。
另外,我还没有使用Redis适配器对此进行测试。
如果必须,如果您使用名称空间,也请参阅this related question。
答案 2 :(得分:7)
对于那些使用命名空间的人,我也创建了一个可以处理不同命名空间的函数。它与nha的答案完全相同。
function get_users_by_room(nsp, room) {
var users = []
for (var id in io.of(nsp).adapter.rooms[room]) {
users.push(io.of(nsp).adapter.nsp.connected[id]);
};
return users;
};
答案 3 :(得分:5)
您可以看到this github pull request有关该主题的讨论,但是,似乎该功能已从SocketIO的1.0预发布候选版本中删除。
答案 4 :(得分:5)
至少1.4.5 nha的方法也不再起作用,并且仍然没有公共api让客户进入房间。这对我有用。
io.sockets.adapter.rooms[roomId]
返回一个具有两个属性,套接字和长度的对象。第一个是另一个对象,它具有用于键的socketId,以及作为值的布尔值:
Room {
sockets:
{ '/#vQh0q0gVKgtLGIQGAAAB': true,
'/#p9Z7l6UeYwhBQkdoAAAD': true },
length: 2 }
所以我的客户代码看起来像这样:
var sioRoom = io.sockets.adapter.rooms[roomId];
if( sioRoom ) {
Object.keys(sioRoom.sockets).forEach( function(socketId){
console.log("sioRoom client socket Id: " + socketId );
});
}