Wakanda websocket onclose не срабатывает при отключении сети

У меня есть реализация веб-сокета на сервере Wakanda. Я отслеживаю подключенные браузеры на стороне сервера. Когда я перезагружаю страницу, я получаю событие onclose веб-сокета, как и ожидалось.

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

Для справки, я использую Wakanda 10.


person Greg M    schedule 22.09.2016    source источник


Ответы (1)


Чтобы помочь вам понять проблему, я дам вам некоторые подробности о соединениях через веб-сокет:

  • Он использует TCP
  • Если удаленный клиент (например, браузер) корректно закрывает TCP-соединение, сервер получает уведомление (FIN)
  • В случае сбоя удаленного клиента ОС, на которой запущено клиентское приложение, уведомляет об этом сервер (RST).
  • Если TCP-соединение открыто между сервером и клиентом, соединение будет считаться открытым, даже если в течение некоторого времени не будет абсолютно никакого обмена данными, если только не активирована функция keepalive.
  • Спецификация WebSocket добавляет сообщение о закрытии, чтобы сервер/клиент мог обработать изящное закрытие.
  • Спецификация WebSocket добавляет обмен сообщениями ping/pong, но не устанавливает тайм-аут. Из RFC: Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in response, unless it already received a Close frame. It SHOULD respond with Pong frame as soon as is practical.
  • В реализации RFC в Ваканде мы отвечаем на полученные ping сообщения, но не отправляем собственные ping сообщения.

Это может быть новая функция, в которой мы можем:

  • выставить метод ping через message port с pong timeout
  • добавить параметр поддержки активности веб-сокета с настраиваемым временем ожидания в момент добавления файла websocket handler.
  • добавить параметр поддержания активности TCP с настраиваемым временем ожидания в момент добавления файла websocket handler.

На данный момент вы можете отправлять клиенту сообщение по вашему выбору каждые N секунд и ждать ответа с тайм-аутом T. Если вы не получили ответ, вы можете предположить, что соединение потеряно, и закрыть его.

person hamzahik    schedule 03.10.2016
comment
Спасибо за объяснение. Прочитав некоторые другие спецификации реализации веб-сокетов, я понял, что это нечто подобное. Я думаю, что было бы неплохо рассмотреть эту функцию, но это зависит от вашей команды! - person Greg M; 03.10.2016