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