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 и принудительное повторное подключение.
Ответы
Ответ 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];
});
});
Надеюсь, это поможет кому-то.