Странное поведение Socket.IO: события «при соединении» и «при разъединении» происходят почти одинаково - PullRequest
2 голосов
/ 19 августа 2011

На сервере Socket IO у меня есть что-то вроде:

io.sockets.on('connection',function(client) {
    console.log(client.id + ' connected at '+(new Date()).getTime());
    client.on('disconnect',function() {
        console.log(client.id + ' DISCONNECTED at '+(new Date()).getTime());
    });
});

И моя проблема в том, что это происходит:

   debug - client authorized
   info  - handshake authorized 15229479751557595508
   debug - setting request GET /socket.io/1/websocket/15229479751557595508
   debug - set heartbeat interval for client 15229479751557595508
   debug - client authorized for 
   debug - websocket writing 1::
15229479751557595508 connected at 1313769716321
   debug - websocket received data packet 5:::{"name":"estimatepp","args":[9]}
   debug - websocket received data packet 5:::{"name":"ready","args":[null]}
   info  - transport end
   debug - set close timeout for client 15229479751557595508
   debug - cleared close timeout for client 15229479751557595508
   debug - cleared heartbeat interval for client 15229479751557595508
15229479751557595508 DISCONNECTED at 1313769716454
   debug - discarding transport

Я не знаю, нормально ли это, но какВы можете видеть, что клиент 15229479751557595508 подключается в 1313769716321 и отключается в 1313769716454, всего через 133 мили-секунды (это число всегда либо 132, либо 133).Я не приказываю клиенту отключиться после чего-то.

Есть идеи, почему это происходит?

Также у меня есть еще одно сомнение.Если я прослушиваю события подключения на io.sockets.on, не должен ли я также прослушивать события отключения?За исключением того, что там нет клиента ...

Как правильно выслушивать отключения?

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: Вымогу игнорировать строки

debug - websocket received data packet 5:::{"name":"estimatepp","args":[9]}
debug - websocket received data packet 5:::{"name":"ready","args":[null]}

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

Ответы [ 2 ]

0 голосов
/ 07 октября 2013

У меня есть подобные мысли, как создатель вопроса.

Время в мс - это, вероятно, ваше время обращения к серверу в оба конца или время, необходимое для управления соединениями с клиентом и т. Д. И т. Д. Поэтому я не стал бы сильно беспокоиться о факторе времени.

Я получаю один и тот же результат, когда обновляю клиента вручную и повторно.между, скажем, интервалами в половину и одну секунду.Похоже, это создает сценарий, который в противном случае происходит только при плохом качестве сети.

Я вижу в журналах, что получаю соединение, перед тем как отключиться с тем же socket.id.
клиент подключен: qEcxQQCivSyKJVbF85dc клиент отключен: qEcxQQCivSyKJVbF85dc

Однако мой on.disconСобытие в этом сценарии НЕ срабатывает.

При отключениях я очищаю свой локальный объект подключенных клиентов и вижу, что я оставил там клиента, и когда я анализирую состояние socket.connected, он отключается.

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

Вероятно, из-за времени, асинхронности, качества сети и т. Д.

Два пути.

  1. Создайте приложение в соответствии с этими ограничениями или
  2. найдите кого-нибудь, кто может придумать более надежный метод для прослушивания on.disconnect, который, как и исходный вопрос, делаетне требует подключения к определенному клиенту сокета.

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

Я лично использую вариант 1. и вместо этого создаю сборщик мусора, который очищает мой локальный массив клиентов, если они отключены.

0 голосов
/ 01 августа 2012

Серверный код, который вы разместили, в порядке и должен работать как положено. Проверьте наличие ошибок в своем клиентском коде (или опубликуйте свой клиентский код здесь). Если ничего нет, попробуйте другой браузер.


Относительно вашего disconnect события.

У вас есть обработчик событий io.sockets.on("connection", function (client) { ... }), в котором при создании нового подключения создается сеанс для подключения и сохраняется в переменной клиента.

Затем вы присоединяете обработчики событий (например, disconnect one) к этому client объекту.

Теперь, когда этот клиент отключается, вызывается обработчик события disconnect, связанный с этим конкретным объектом client.

Более того, как вы можете видеть в Открытые события - Socket.io , io.sockets.on выставляет только событие connection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...