【问题标题】:Socket.io doesn't close connections when users close browser当用户关闭浏览器时,Socket.io 不会关闭连接
【发布时间】:2016-06-27 11:54:18
【问题描述】:

我有一个套接字服务器(socket.io + nodejs)和一个套接字客户端(socket.io)。问题是当用户关闭浏览器时客户端连接仍然保持打开状态,从而产生大量死连接。

例如,当我打开浏览器并运行此命令“lsof -i -n -P | grep node | grep ‘my ip address’”时,我有一个连接。当我关闭浏览器并再次运行该命令时,连接仍保持打开状态。

非常感谢大家愿意帮助我!

【问题讨论】:

  • 它在什么(TCP)状态下保持打开状态?

标签: javascript node.js sockets


【解决方案1】:

尝试在客户端使用socket.disconnect(),这应该可以。

一旦服务器或客户端触发断开连接,连接不应开启。服务器端的代码中必须存在其他问题。 尝试使用它来关闭服务器端的连接

socket.on('terminate', function (){
    socket.disconnect(0);
});

这在客户端:

var io = io();
io.emit('terminate');

看看它是否适合你。 谢谢

【讨论】:

    【解决方案2】:

    制作乒乓球功能,服务器将广播ping事件,客户端必须以pong响应。
    如果在 10 秒内(在本例中)服务器不会收到 pong 事件,那么垃圾清理功能将断开套接字。

    服务器端:

    var aliveSockets = {};
    
    // broadcasting ping
    setInterval(function() {
      io.emit('ping', {timestamp: (new Date()).getTime()});
    }, 10000); // 10 seconds
    
    // cleaning up stalled socket which does not answer to ping
    setInterval(function() {
      aliveSockets.forEach(function(aliveSocket, idx) {
        if(!aliveSocket) {return;}
        if(aliveSocket.lastPong + 10 < (new Date().getTime())/1000) {
          aliveSocket.socket.disconnect(0);
          delete aliveSocket[idx];
        }
      });
    }, 1000); // 1 second
    
    io.on('connection', function(socket) {
      sockets[socket.id] = socket;
    
      socket.on('pong', function() {
        aliveSockets[socket.id] = {socket: socket, lastPong: ((new Date()).getTime()/1000)};
      });
    });
    

    客户端:

    io.on('ping', function() {
      io.emit('pong', {timestamp: (new Date()).getTime()});
    });
    

    附言。想法只是解决方法,但我不喜欢写乒乓球,只相信socket.io库,它会在一段时间(~1分钟)后删除它

    阅读:https://github.com/socketio/engine.io#methods-1 你可以看到它有pingTimeout 这意味着 socket.io 会自动处理你的问题。

    pingTimeout (Number): 多少毫秒没有一个 pong 数据包要考虑 连接关闭(60000)

    【讨论】:

    • 这就是socket.io(或者更确切地说,底层engine.ioalready doespingTimeoutpingInterval)。
    • @robertklep 你没有每个人的耐心(:我正在写它,看看我的答案的变化。
    • 哈哈抱歉,下次我会尽量慢一点;)
    • @robertklep 我理解你的评论速度(:我写的所有这些都是为了向问题所有者展示它可以这样完成,但它已经由引擎本身完成了。
    • 感谢您的帮助!实际上连接仍然非常开放和稳定,我正在尝试根据您的建议修改我的代码,准备好再次给我支持:)
    猜你喜欢
    • 2018-11-26
    • 2013-02-16
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2019-01-17
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多