如何在socket.io 1.0中获取房间的客户列表
我可以用socket.io 0.9中的这段代码得到房间的客户列表。
io.sockets.clients(roomName)
我怎么能在socket.io 1.0中做到这一点?
考虑这个更完整的答案链接在上面的评论上的问题: https : //stackoverflow.com/a/24425207/1449799
在一个房间的客户可以在find
io.nsps[yourNamespace].adapter.rooms[roomName]
这是一个带有套接字标识的关联数组。 在我们的例子中,我们想知道一个房间里的客户数量,所以我们做了Object.keys(io.nsps[yourNamespace].adapter.rooms[roomName]).length
如果你没有看到/使用命名空间(像这个家伙),你可以在这里了解它们http://socket.io/docs/rooms-and-namespaces/ (重要的是:默认的命名空间是'/ “)
更新(特别是@Zettam):
结帐这个回购看到这个工作: https : //github.com/thegreatmichael/socket-io-clients
使用@ryan_Hdot链接 ,我在我的代码中做了一个小的临时函数,避免了维护补丁。 这里是 :
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适配器testing过。
如果你不得不,如果你正在使用命名空间,也可以看到这个相关的问题 。
对于那些使用命名空间的人,我也做了一个可以处理不同命名空间的函数。 这和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; };
你可以看到这个github pull请求讨论这个话题,但是,似乎这个function已经从1.0版本的SocketIO的候选版本中去掉了。
至less1.4.5 nha的方法也不能工作了,而且还没有让客户进入房间的公共API。 这是对我有用的东西。
io.sockets.adapter.rooms[roomId]
返回一个具有两个属性,套接字和长度的对象。 第一个是另一个具有socketId键的对象,boolean是值:
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 ); }); }