如何跟踪socket.io
中所有已连接的客户端?
我在服务器上试过这个:
let numSockets = 0;
io.on('connection', (socket) => {
io.sockets.emit('numSockets', ++numSockets);
socket.on('disconnect', () => {
io.sockets.emit('numSockets', --numSockets);
});
});
在客户端上:
const socket = io();
socket.on('numSockets', function (numSockets) {
console.log(numSockets);
});
它会打印一个数字,但数字,但是,如果我打开2个窗口,它会显示4个连接的插座。
这是正确的方法吗?
我想要实现的是在我的网站的侧边栏中打印已连接套接字ID的列表,并让用户设置用户名(而不是自动生成的ID)。
但在继续讨论之前,我会确保能够以正确的方式跟踪插座。
答案 0 :(得分:1)
Namespace#connected
对象包含连接到特定命名空间的所有套接字(由其id键控)。
检索默认命名空间(/
)的套接字ID:
let clientIds = Object.keys( io.of('/').connected );
(其中io
是服务器实例)
答案 1 :(得分:0)
我相信它是Object.keys(io.sockets.connected).length
。检查服务器API http://socket.io/docs/server-api/
答案 2 :(得分:0)
我认为io.sockets.emit(io.of('/').connected)
不是一个好主意,因为它会发送一个套接字对象的散列,这是很多数据: - )
您可以尝试以下功能:
function findUsersConnected(room, namespace) {
var names = [];
var ns = io.of(namespace || "/");
if (ns) {
for (var id in ns.connected) {
if(room) {
var roomKeys = Object.keys(ns.connected[id].rooms);
for(var i in roomKeys) {
if(roomKeys[i] == room) {
if (ns.connected[id].username) {
names.push(ns.connected[id].username);
} else {
names.push(ns.connected[id].id);
}
}
}
} else {
if (ns.connected[id].username) {
names.push(ns.connected[id].username);
} else {
names.push(ns.connected[id].id);
}
}
}
}
return names.sort();
}
返回连接到命名空间中的房间的用户数组。如果套接字没有socket.username
属性,则使用socket.id
代替。
例如:
var usersConnected = findUsersConnected();
var usersConnected = findUsersConnected('myRoom');
var usersConnected = findUsersConnected('myRoom', '/myNamespace');
答案 3 :(得分:0)
截至今天,socket.io 在服务器端实现了一个名为 fetchSockets() 的函数来检索当前在服务器端连接的所有套接字。 (来源:https://socket.io/docs/v4/server-instance/#fetchSockets)
然后你可以像这样使用它:
const io = require("socket.io")
async function retrieveSockets() {
const connectedSockets = await io.fetchSockets()
}
据我测试,您甚至可以在套接字上执行操作,例如发出事件、加入房间等