gpt4 book ai didi

javascript - 使用 socket.io 跟踪连接的套接字

转载 作者:行者123 更新时间:2023-11-30 00:02:42 27 4
gpt4 key购买 nike

如何在 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)。

但在继续之前,我将确保我可以以正确的方式跟踪套接字。

最佳答案

我不认为 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');

关于javascript - 使用 socket.io 跟踪连接的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39762303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com