2016-06-27 4 views
0

У меня есть сервер сокетов (socket.io + nodejs) и клиент сокета (socket.io). Проблема заключается в том, что клиентские соединения остаются открытыми также, когда пользователи закрывают браузер, создавая большое количество мертвых подключений.Socket.io не закрывает соединения, когда пользователи закрывают браузер

Например, когда я открываю браузер и запускаю эту команду «lsof -i -n -P | grep node | grep» мой IP-адрес «У меня есть одно соединение. Когда я закрываю браузер и снова запускаю эту команду, соединение остается открытым.

Спасибо, что все хотят мне помочь!

+0

Он остается открытым в каком (TCP) состоянии? – robertklep

ответ

0

Попробуйте использовать на стороне клиента socket.disconnect(), это должно сработать.

соединения не должно быть на раз либо сервер или клиент запускает разъединение. В вашем коде на стороне сервера должна быть какая-то другая проблема. Попробуйте использовать это, чтобы закрыть соединение на стороне сервера

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

И это на стороне клиента:

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

Смотрите, если он работает для вас. Спасибо

+0

Не работает к сожалению :( – Ale

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. идея просто обходной путь, но я предпочитаю не писать пинг-понг-ERS, просто поверьте в Socket.io библиотеки, она будет удалена через некоторое время (~ 1 минуту)

прочитать: https://github.com/socketio/engine.io#methods-1 Вы можете увидеть он имеет pingTimeout, что означает, что socket.io будет обрабатывать вашу проблему автоматически.

pingTimeout (Number): сколько мс без пакета понга рассмотреть соединение закрыто (+60000)

+0

Это то, что 'socket.io' (вернее, базовый' engine.io') [уже делает] (https://github.com/socketio/engine.io#methods- 1) ('pingTimeout' и' pingInterval') – robertklep

+0

@robertklep У вас нет терпения, как и все (: я писал это, вижу изменения в своем ответе. – num8er

+0

Ха-ха, извините, я постараюсь быть менее быстрым в следующий раз;) – robertklep

Смежные вопросы