【问题标题】:Socket IO: How to define disconnected socket id (when multiple tabs)?套接字 IO:如何定义断开连接的套接字 id(当多个选项卡时)?
【发布时间】: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') 里面定义呢?

【问题讨论】:

标签: javascript websocket server socket.io


【解决方案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);   
  });
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2019-03-05
    • 1970-01-01
    • 2012-11-22
    • 2017-01-21
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多