[英]how to get socket.io number of clients in room?
我的 socket.io 版本 1.3.5
我想获得特定房间的客户数量。
这是我的代码。
socket.on('create or join', function (numClients, room) {
socket.join(room);
});
我使用此代码让客户进入房间:
console.log('Number of clients',io.sockets.clients(room));
这适用于版本 3
io.sockets.adapter.rooms.get(roomName).size
要获取房间中的客户数量,您可以执行以下操作:
function NumClientsInRoom(namespace, room) {
var clients = io.nsps[namespace].adapter.rooms[room];
return Object.keys(clients).length;
}
这个变量 clients 将保存一个对象,其中每个客户端都是一个键。 然后,您只需获取该对象中的客户端(键)数量。
如果您尚未定义命名空间,则默认命名空间为“/”。
有一个计数器变量来保持计数,当有人加入时增加,当人们断开连接时减少。
io.on('connection', function (socket) {
var numClients = {};
socket.on('join', function (room) {
socket.join(room);
socket.room = room;
if (numClients[room] == undefined) {
numClients[room] = 1;
} else {
numClients[room]++;
}
});
socket.on('disconnect', function () {
numClients[socket.room]--;
});
这对我有用。
// check if your room isn't undefined.
if (io.sockets.adapter.rooms['your room name'])
{
// result
console.log(io.sockets.adapter.rooms['your room name'].length);
}
这对我有用
io.in('yourRoom').allSockets().then(result=>{
console.log(res.size) })
在 socket.io ^1.4.6
function numClientsInRoom(namespace, room) {
var clients = io.nsps[namespace].adapter.rooms[room].sockets;
return Object.keys(clients).length;
}
您需要将.sockets
添加到rooms[room]
,因为变量 clients 将所有连接保存在sockets
变量中。
我参加聚会有点晚了,但我找到了一个有效的解决方案:
io.in('YOUR_ROOM').engine.clientsCount;
socket.io 的rooms
是一个Map
,其元素映射到Set
s。
您使用get(roomId)
在Map
中获取该roomId
的值,并使用.size
来表示集合中的元素数,这与.length
表示数组中的元素数不同。
socket.on("join-room",roomId => { const room = io.of("/yourNameSpace").adapter.rooms.get(roomId) if(room === undefined || room.size < 2) { socket.join(roomId) }else { io.of("/yourNameSpace").emit("can't join link") } })
io.nsps['/'].adapter.rooms['your room name'].sockets;
如果您的命名空间不是/
,请更改它。
2022 年只有一个使用 socket.io 4.5.1 对我有用:
io._nsps.get('/').adapter.rooms.get('your-room-id').size;
感谢@Abhishek Kumar,只是为了提高知名度而发表了顶级评论。
如果您只有一个服务器实例,最简单的方法是:
// rooms is a Map object
const rooms = io.of("/").adapter.rooms;
const roomSockets = rooms.get('roomid')
你可以从这里的官方文档中看到
但是,如果您有多个服务器实例并且正在使用 Redis 之类的适配器,这将不起作用,因为它只会返回该实例内存中的套接字,因此根据您请求命中的服务器实例,结果会有所不同。
要获得实际的房间和插座,您需要(对于 RedisAdapter):
// this is a Set of room ids
const rooms = await io.of("/").adapter.allRooms();
// or get the sockets directly if you know the room id
const roomSockets = await io.of("/").adapter.sockets(new Set(['room id']);
您可以在此处查看更多方法
// 返回主命名空间的“room1”房间中的所有 Socket 实例
const sockets = 等待 io.in("room1").fetchSockets();
尝试 sockets.size 或 sockets.length 以获取实际计数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.