Понимание процесса отключения/повторного подключения и сообщений об ошибках

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

var pusher = new Pusher('MY_ACCOUNT_STRING');
pusher.connection.bind('state_change', function(states) {
  console.log(states.current);
});

Затем я обновляю страницу, получаю соединение с толкателем, отключаю свое интернет-соединение, жду, пока толкатель обнаружит отключение, снова включаю мое интернет-соединение и жду, пока толкатель обнаружит это. Вот скриншот вывода консоли Chrome во время процесса (нажмите здесь, чтобы увеличить его):

консоль Chrome во время отключения

Вот мои вопросы:

  1. Прошло больше минуты, возможно, даже 2-3 минуты, прежде чем пушер обнаружил отключение. Есть ли способ уменьшить это время, чтобы толкатель обнаруживал отключение в течение 10 или около того секунд?
  2. Почему я вижу эти красные ошибки и что именно они означают? Это нормально? Я бы подумал, что при правильной настройке ошибки будут обработаны, поскольку событие отключения является ожидаемым исключением в контексте толкателя.
  3. Что такое ошибка 1006 и почему я ее вижу?

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

РЕДАКТИРОВАТЬ:

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

disconnected login.js:146
connecting login.js:146
Pusher : Error : {"type":"WebSocketError","error":{"type":"PusherError","data":{"code":1007,"message":"Server heartbeat missed"}}} pusher.min.js:12
connected 

person Jonah    schedule 21.08.2013    source источник


Ответы (1)


Это ненормальное поведение. У вас была возможность проверить это на другой машине и в другой сети? Похоже на проблемы с сетью.

Вопрос 1.

Когда я отключаю Wi-Fi, толкателю требуется 4 секунды, чтобы заметить и изменить состояние на disconnected, а затем на unavailable.

Когда я снова включаю Wi-Fi, я получаю ту же ошибку, что и вы на http://js.pusher.com/2.1.3/sockjs.js

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

var pusher = new Pusher('MY_ACCOUNT_STRING',  {
    pong_timeout: 6000, //default = 30000
    unavailable_timeout: 2000 //default = 10000
});

Вопрос 2.

Понятия не имею, я не думаю, что библиотека должна выдавать эти ошибки

Вопрос 3.

Ошибка связана с протоколом WebSocket: http://tools.ietf.org/html/rfc6455

  1006 is a reserved value and MUST NOT be set as a status code in a
  Close control frame by an endpoint.  It is designated for use in
  applications expecting a status code to indicate that the
  connection was closed abnormally, e.g., without sending or
  receiving a Close control frame.

  1007 indicates that an endpoint is terminating the connection
  because it has received data within a message that was not
  consistent with the type of the message (e.g., non-UTF-8 [RFC3629]
  data within a text message).
person Tieme    schedule 24.10.2013
comment
В итоге я написал по электронной почте в службу поддержки пушеров, и они в основном сказали, что это нормальное поведение, и я ничего не мог с этим поделать, кроме как изменить тайм-ауты пинг-понга. - person Jonah; 24.10.2013
comment
Хм, они дали какой-нибудь совет о хорошей цене? Или просто нужно было с ним поэкспериментировать? Удалось ли вам попробовать его в другой сети или на другой машине? - person Tieme; 24.10.2013
comment
Да, в некоторых местах он работает лучше, чем в других. По сути, они сказали, что если собственное определение сокета браузера работает правильно, оно обнаружит почти мгновенно. Но это не на 100% надежно, даже в новых браузерах. Почему и в каких ситуациях он выходит из строя, они, похоже, не знали. Поэтому, если вам нужно быть в безопасности, вы можете снижать свой pong до каждых 10 секунд, но это не рекомендуется, потому что это нагружает их серверы, и я думаю, что это также может дать ложные срабатывания iirc. Суть в том, что базовая технология не является надежной. - person Jonah; 24.10.2013