【问题标题】:socket.io 'disconnect' not called if page refreshed fast enough如果页面刷新速度足够快,则不会调用 socket.io 'disconnect'
【发布时间】:2022-02-13 11:30:58
【问题描述】:

我有以下删减代码:

io.on('connection', function(client) {
    client.uuid = uuid.v4();
    // add client object to server...

    console.log('socket.io:: client connected ' + client.uuid );

    client.on('disconnect', function() {
        console.log('socket.io:: client disconnected ' + client.uuid );
        // remove client object from server...
    });
});

如果我在浏览器中打开此页面,一切似乎都很好。如果我刷新页面,它将触发disconnect,然后触发connection。但是,如果我刷新得足够快,有时disconnect 不会被调用,因此客户端数据不会从服务器中清除。有什么办法可以避免这种情况吗?

编辑:改写reconnect -> connection

【问题讨论】:

  • 无法保证浏览器有时间向服务器发送请求,无论是使用 ajax 还是套接字。浏览器不等待任何人,它会重新加载/重定向,并且您不能停止或延迟它(因为这对用户来说真的很烦人)
  • 修复通常是从服务器轮询,看看用户是否仍然存在,socket.io 会自动通过心跳执行此操作,并且可能有一个 leaveunsubscribe 事件服务器端当客户端没有响应时触发
  • 如果刷新太快,reconnect 是否会发生?我不这么认为..
  • 您可以通过打开节点调试来弄清楚孤立连接会发生什么
  • 我将服务器打开了一会儿,我看到在大约 30-60 秒后我看到disconnect 事件触发。 @adeneo 你想把你的评论写成答案让我接受吗?

标签: javascript socket.io


【解决方案1】:

正如adeneo 提到的,socket.io 有心跳,它会自动检查客户端是否仍然连接。如果disconnect 代码检测到客户端实际上已经离开,它就会被触发。复制了我原来的问题后,我尝试让服务器保持开启状态,大约 30 秒后,“死”客户端被删除。所以要解决这个问题,你只需要等待。 Socket.io 自己处理一切。

【讨论】:

    【解决方案2】:

    same question was answered here

    TL;DR 您可以在客户端上使用这些选项:

    const socket = io({
      transports: ['websocket'],
      upgrade: false
    });
    

    这将完全阻止socket.io 使用HTTP polling 方法,从而导致问题。我在 v4 上成功使用了这个技巧。

    【讨论】:

      猜你喜欢
      • 2015-08-25
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      相关资源
      最近更新 更多