サーバーが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.
がこれを読んで(〜1分)アイデアは単なる回避策ですが、私はピンポン-ERS、単にライブラリをsocket.ioために信頼が、それはいくつかの時間後に削除されます書きたくないん:https://github.com/socketio/engine.io#methods-1あなたは見ることができますそれはpingTimeout
です。つまり、socket.ioはあなたの問題を自動的に処理します。
pingTimeout(番号):どのように多くのMSピンポンパケットなしで考慮することが 接続が閉じられ(60000)
それは何(TCP)の状態で開いたまま? – robertklep