Сделать пинг-понг, где сервер будет транслировать событие 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)
Он остается открытым в каком (TCP) состоянии? – robertklep