2016-06-27 29 views
0

私はソケットサーバ(socket.io + nodejs)とソケットクライアント(socket.io)を持っています。問題は、ユーザーがブラウザを閉じたときにもクライアント接続が開かれたままになり、多数のデッド接続が発生することです。ユーザがブラウザを閉じるときにSocket.ioが接続を閉じない

たとえば、ブラウザを開いてこのコマンドを実行すると、 "lsof -i -n -P | grep node | grep 'my ip address'"という接続が1つあります。ブラウザを閉じてそのコマンドをもう一度実行すると、接続は開いたままです。

ありがとうございました。皆が私を助けたいと思っています!

+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.

がこれを読んで(〜1分)アイデアは単なる回避策ですが、私はピンポン-ERS、単にライブラリをsocket.ioために信頼が、それはいくつかの時間後に削除されます書きたくないん:https://github.com/socketio/engine.io#methods-1あなたは見ることができますそれはpingTimeoutです。つまり、socket.ioはあなたの問題を自動的に処理します。

pingTimeout(番号):どのように多くのMSピンポンパケットなしで考慮することが 接続が閉じられ(60000)

+0

これは、 'socket.io'(あるいはその下にある' engine.io')[既にあります](https://github.com/socketio/engine.io#methods- 1)( 'pingTimeout'と' pingInterval') – robertklep

+0

@robertklep皆さんのように忍耐力はありません(私はそれを書いていましたが、私の答えの変化を見てください) – num8er

+0

母は申し訳ありませんが、 ) – robertklep

関連する問題