用户关闭浏览器时,Socket.io不会关闭连接

时间:2016-06-27 11:54:19

标签: javascript node.js sockets

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

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

非常感谢大家都想帮助我!

2 个答案:

答案 0 :(得分:0)

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

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

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

这在客户端:

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

看看它是否适合你。 感谢

答案 1 :(得分:0)

制作乒乓功能,服务器将广播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()});
});

<强> P.S。想法只是解决方法,但我不想写ping-pong-ers,只信任socket.io库,它会在一段时间后删除它(~1分钟)

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

  

pingTimeout(Number):没有pong包要考虑多少ms   连接关闭(60000)