Согласно спецификации протокола v76 (это версия, которую реализует браузер с текущей поддержкой):
Чтобы правильно закрыть соединение, от одного однорангового узла отправляется кадр, состоящий только из байта 0xFF, за которым следует байт 0x00, чтобы попросить другого однорангового узла закрыть соединение.
Если вы пишете сервер, вы должны убедиться, что отправили закрывающий фрейм, когда сервер закрывает клиентское соединение. Обычный метод закрытия сокета TCP иногда может быть медленным и заставлять приложения думать, что соединение все еще открыто, даже если это не так.
Браузер действительно должен делать это за вас, когда вы закрываете или перезагружаете страницу. Однако вы можете убедиться, что кадр закрытия отправлен, захватив событие beforeunload:
window.onbeforeunload = function() {
websocket.onclose = function () {}; // disable onclose handler first
websocket.close();
};
Я не уверен, как можно получить событие onclose после обновления страницы. Объект websocket (с обработчиком onclose) больше не будет существовать после перезагрузки страницы. Если вы немедленно пытаетесь установить соединение WebSocket на своей странице при загрузке страницы, то вы можете столкнуться с проблемой, когда сервер отказывает в новом соединении сразу после того, как старое отключилось (или браузер не готов. для установления соединений в точке, в которой вы пытаетесь подключиться), и вы получаете событие onclose для нового объекта websocket.
onclose
событие запускается неожиданно или, возможно, специально, когда пользователь перемещается / страница перезагружается. Я разместил вопрос о том, каким должно быть ожидаемое поведение, в каком браузере оно работает правильно и как мы реализуем автоматическое переподключение.