gpt4 book ai didi

javascript - 在 Sockets.IO Node.JS 中存储和访问客户端列表的最有效方法

转载 作者:行者123 更新时间:2023-12-03 11:59:04 26 4
gpt4 key购买 nike

我有这个简单的 socket.io 管理器,当用户连接时,他将被添加到在线客户端池中,当另一个客户端(比如客户端 B)向客户端 A 发送消息时,它应该尝试发送仅当客户端在池中时才发送消息。目前我有这个:

var connectionMap = [];
const socketHandler = (io) => {
io.on("connection", (socket) => {
socket.id = "some_custom_id I define";
connectionMap.push(socket);

socket.on("textMessage", function (message) {
connectionMap.forEach(function (connection, index) {
if (connection.id == message.receiver_id)
connection.emit("textMessage", message);
});
});

socket.on("disconnect", function () {
connectionMap.splice(connectionMap.indexOf(client), 1);
});
});
};
尽管这可能适用于用户数量较少的用例,但我正在寻找一种可以适当扩展而不会过多限制性能的解决方案。 (我无法想象在跨平台发送的每条消息上都有一个跨数千个索引的 foreach。)关于如何解决这个问题的任何想法?

最佳答案

您可以为 connectionMap 使用对象而不是数组.在连接时,我们设置了 socket.id作为对象中的键,值可以是 true .留言时我们可以直接查看connectionMap如果 message.receiver_id存在。与使用数组作为 connectionMap 相比,这是一个显着的改进。因为在最坏的情况下,数组将花费 O(N) 时间,而对于对象(映射),您可以获得恒定的时间 O(1)

var connectionMap = {};
const socketHandler = (io) => {
io.on("connection", (socket) => {
socket.id = "some_custom_id I define";
connectionMap[socket.id] = socket;

socket.on("textMessage", function (message) {
if (connectionMap[message.receiver_id]) {
connectionMap[message.receiver_id].emit("textMessage", message);
}
});

socket.on("disconnect", function () {
delete connectionMap[client];
});
});
};
或者您可以使用 Map
var connectionMap = new Map();
const socketHandler = (io) => {
io.on("connection", (socket) => {
socket.id = "some_custom_id I define";
connectionMap.set(socket.id, socket);

socket.on("textMessage", function (message) {
if (connectionMap.has(message.receiver_id)) {
connectionMap.get(message.receiver_id).emit("textMessage", message);
}
});

socket.on("disconnect", function () {
connectionMap.delete(client);
});
});
};

关于javascript - 在 Sockets.IO Node.JS 中存储和访问客户端列表的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63038016/

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