2016-09-22 3 views
1

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

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

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

ответ

2

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

  • Он использует TCP
  • Если удаленный клиент (например, браузер) закрывает TCP-соединение изящно, сервер уведомляется (FIN)
  • Если сбой удаленного клиента, ОС, запускающая клиентское приложение, уведомляет сервер (RST)
  • Если TCP-соединение открыто между сервером и клиентом, соединение будет считаться открытым, даже если обмен данными не происходит в течение некоторого времени, если не активировано keepalive.
  • Спецификация WebSocket добавляет закрытое сообщение, чтобы сервер/клиент мог обрабатывать изящное закрытие.
  • Спецификация WebSocket добавляет обмен сообщениями пинг/понг, но не налагает тайм-аут. Из 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 keepalive с настраиваемым таймаутом в момент добавления websocket handler.

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

+0

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

Смежные вопросы