27

Node 0.6.16 を実行していますが、少なくとも npm (win7 x64) によると、すべてのモジュールは最新です。切断が発生していなくても、何らかの理由でしばらくすると、おそらく 1 時間後、ブラウザーがデータを受信して​​いないことがわかりませんでした。Chrome よりも FF の方が頻繁に発生するようです。

socket.on('disconnect', function (){console.log('disconnected')});

これは、その特定のイベントで発生することはありません (発生する可能性があることを意味しますが、ログと socket.io の自動再接続を取得します - この場合、何も起こらず、動作を停止するだけで、これが最も頻繁なイベントです)。

だから、どこを見たらいいのかわからない。NodeJS は引き続きハートビートをログに記録しますが、何らかの理由で接続が確立されていません。(任意の?) ブラウザのタブを変更すると、しばらくすると、ウィンドウ/タブにフォーカスがなくなるため、socket.io がデータの受信を停止するのではないかと疑っています。私が間違っている可能性があり、焦点とは関係がない可能性がありますが、これが私の主要なリードです。他に何かアイデアはありますか?

編集:クライアント側はかなり簡単です:

socket = io.connect('http://xxx.xxx.xxx.xxx:8081', {secure:false, 'reconnect': true, 'reconnection delay': 500, 'max reconnection attempts': 10});      
            socket.on('connect', function(){console.log('connected')});
            socket.on('message', function(data){//do something);        

            socket.on('disconnect', function (){console.log('disconnected')});

Edit2 : 最新バージョンの socket.io (1.2.1) とノード v0.10.35 に更新した後も、同じ問題が発生します。さらに驚くべきことに、クライアントに次のコードを追加しました。

function checkSocket(){
    if(socket){
        if(!socket.connected){
            console.log('socket disconnected');
            clearInterval(intv);
        }
    }       
}

intv = setInterval(checkSocket, 1000);

関数は毎秒実行されますが、ソケットが切断されたことをログに記録することはありません。これ以上何も受信せず、まだハートビートが送信されている場合でも..

Edit3:サーバー側のコードにありましたが、一部のソケットが破棄されていました。またv1.xにアップデートして強制再接続。

4

1 に答える 1

0

もう問題はないようですので、バックエンド コードを共有したいと思います。私が信じている問題は、ソケットを上書きしていたことです。

var clients = {};
var app = require('https').createServer(options),
io = require('socket.io').listen(app);  
app.listen(8081);

io.sockets.on('connection', function(__socket) {
    var id = __socket.id;
    var ip = __socket.request.connection.remoteAddress;
    clients[id] = {socket:__socket, ip:ip}; 
    clients[id].socket.on('disconnect', function() {
        delete clients[id];     
   });
});
于 2015-06-26T22:51:16.867 に答える