套接字 IO:如何定义断开连接的套接字 id(当多个选项卡时)?
Posted
技术标签:
【中文标题】套接字 IO:如何定义断开连接的套接字 id(当多个选项卡时)?【英文标题】:Socket IO: How to define disconnected socket id (when multiple tabs)? 【发布时间】:2020-10-01 00:16:17 【问题描述】:当我打开多个选项卡(1、2、3)时,我在服务器日志中看到套接字包含所有这些特殊套接字。 我还将这个套接字 ID 保存在我的数组中。 当我关闭选项卡 1 时,此 socket.id 从套接字列表中删除。 但是在我的数组中,它只删除了最后打开的套接字。但我需要删除 1。
const array = [];
io.sockets.on('connection', (socket) =>
array.push(socket.id);
//after opened 3 tabs, there be [socketId-1, socketId-2, socketId-3]
//then I closing 1st tab and waiting for result [socketId-2, socketId-3]
socket.on('disconnect', () =>
array = array.filter(() => socketId !== socket.id)
//there will be removed socket.id of last connected tab
console.log(array) // [socketId-1, socketId-2]
)
)
如果我可以定义关闭标签的 socked.id,那么它可以解决我的问题。但是如何在 socket.on('disconnect') 里面定义呢?
【问题讨论】:
听起来您想跟踪旧连接。对吗? love2dev.com/blog/javascript-remove-from-array/…. @SHenry 是的。我需要断开连接的 socket.id,因为我在其他集合中收集它们,它也应该在那里删除。 【参考方案1】:好的,我找到了解决方案。可能不是最好的,但它对我有用。 在断开功能中,我获取所有当前连接的套接字,然后与我的数组进行比较并过滤它们。可能会更好地编写自己的过滤函数,但我使用了下划线“交集”方法。
我猜它可能会影响具有大量在线用户的应用的性能。但它对生活有权利)
import _ from 'lodash';
const array = [];
io.sockets.on('connection', (socket) =>
array.push(socket.id);
socket.on('disconnect', function ()
const connectedSockets = Object.keys(socket.nsp.sockets);
array = _.intersection(array, connectedSockets);
);
)
【讨论】:
以上是关于套接字 IO:如何定义断开连接的套接字 id(当多个选项卡时)?的主要内容,如果未能解决你的问题,请参考以下文章