套接字 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(当多个选项卡时)?的主要内容,如果未能解决你的问题,请参考以下文章

如何将用户名从php会话存储到nodejs中的socket.io库和页面刷新时套接字连接断开。为啥?

如何使用 socket.io 断开所有套接字服务端?

socket io:如何传递参数来断开套接字事件?

套接字 IO - 新会话触发断开连接

刷新时Socket.io断开连接?

Socket.io 断开事件和相关闭包的垃圾收集