Socket.io Random Disconnects (v1.0.6)

Я использую последнюю версию socket.io(1.0.6), чтобы сделать многопользовательскую онлайн-игру с Phaser и Node. Моя проблема в том, что как только клиенты подключатся, они будут время от времени и наугад отключать. Кажется, что нет конкретного случая, когда это происходит. Иногда это происходит, когда игра полностью бездействует, а иногда это происходит, когда все игроки отправляют входные данные на сервер.

Проверяя вывод debug из socket.io, я обнаружил, что причиной отключения является "тайм-аут ping". В частности, следующая строка запускается из файла библиотеки socket.js:

Socket.prototype.setPingTimeout = function () {
  var self = this;
  clearTimeout(self.pingTimeoutTimer);
  self.pingTimeoutTimer = setTimeout(function () {
    self.onClose('ping timeout'); // <------------------------
  }, self.server.pingInterval + self.server.pingTimeout);
};

Есть ли причина, по которой это происходит? Я просто проверяю свой сервер на localhost, поэтому у меня нет причин думать, что будет какая-то значительная задержка, чтобы вызвать тайм-аут. Мои сокеты настроены в соответствии с примером приложения чата на веб-сайте socket.io:

Сервер:

//http server setup
var io = require('socket.io')(http);
io.on('connection', function(socket){
  //Game logic,socket listeners, io.emits
});

Клиент:

var socket = io();
//client side listeners, emissions back to server

Мой вопрос - во-первых, каковы возможные причины, по которым я получаю тайм-аут ping с перерывами? и во-вторых, есть ли способ установить время таймаута намного дольше/короче, чтобы проверить, как это влияет на частоту отключений, которые я получаю?

Ответы

Ответ 1

К сожалению, вы не можете изменять интервалы ping, используя socket.io, если бы вы использовали основную библиотеку (engine.io).


Спасибо Paweł Wszoła за то, что он указал на правильный ответ. Согласно документам на socket.io:

Те же самые параметры, переданные в socket.io, всегда передаются на созданный сервер engine.io.

Таким образом, вы можете установить тайм-аут ping и интервал ping, передав их в качестве параметров.

require ('socket.io'). listen (app, {pingTimeout: 4000, pingInterval: 4000});

Ответ 2

Вы получаете это в консоли ур,

debug - setting request GET /socket.io/1/jsonp-polling/487577450665437510?t=1312872393095&i=1
debug - setting poll timeout
debug - clearing poll timeout
debug - jsonppolling writing io.j[1]("7:::1+0");
debug - set close timeout for client 487577450665437510
warn  - client not handshaken client should reconnect
info  - transport end
debug - cleared close timeout for client 487577450665437510
debug - discarding transport
debug - setting request GET /socket.io/1/xhr-polling/487577450665437510
debug - setting poll timeout
debug - clearing poll timeout
debug - xhr-polling writing 7:::1+0
debug - set close timeout for client 487577450665437510
warn  - client not handshaken client should reconnect
info  - transport end
debug - cleared close timeout for client 487577450665437510
debug - discarding transport
debug - setting request GET /socket.io/1/jsonp-polling/487577450665437510?t=1312872393150&i=1
debug - setting poll timeout
debug - clearing poll timeout
debug - jsonppolling writing io.j[1]("7:::1+0");
debug - set close timeout for client 487577450665437510
warn  - client not handshaken client should reconnect
info  - transport end
debug - cleared close timeout for client 487577450665437510
debug - discarding transport
debug - setting request GET /socket.io/1/xhr-polling/487577450665437510
debug - setting poll timeout
debug - clearing poll timeout
debug - xhr-polling writing 7:::1+0
debug - set close timeout for client 487577450665437510
warn  - client not handshaken client should reconnect

https://github.com/Automattic/socket.io/wiki/Configuring-Socket.IO