Подтвердить что ты не робот

NodeJS socket IO останавливается, излучая случайным образом?

Я запускаю Node 0.6.16, и все модули обновляются по крайней мере в соответствии с npm (win7 x64). Я мог заметить, что даже если у меня нет разъединения, но по какой-то причине через некоторое время я не мог сказать, может быть, 1 час, браузер не получает никаких данных. Он кажется более частым в FF, чем в Chrome.

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

Это никогда не срабатывает для этого конкретного события (я имею в виду, что это может произойти, но затем я получаю log и connect.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) и Node v0.10.35 у меня все еще такая же проблема. Еще более удивительно, что я добавил следующий код в клиенте:

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

intv = setInterval(checkSocket, 1000);

В то время как функция запускается каждую секунду, она никогда не регистрирует, что сокет отключен, даже если он больше ничего не получает и все еще отправляется heartbeats.

Edit3: Хорошо, что это было на моем серверном коде, некоторые сокеты уничтожались. Также обновлено до v1.x и принудительное повторное подключение.

4b9b3361

Ответ 1

Так что, похоже, у меня больше нет проблем, я думал, что поделюсь своим внутренним кодом. Моя проблема в том, что я переписывал сокет.

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];     
   });
});

Надеюсь, это поможет кому-то.