Wakanda websocket onclose не стреляет при отключении сети

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

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

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

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. Если вы не получили ответ, вы можете предположить, что связь потеряна, и закрыть ее.

Другие вопросы по тегам