Відповідно до специфікації протоколу v76 (яка версія, яку браузер із поточною підтримкою реалізує):
Для чистого закриття з’єднання від одного однорангового повідомлення надсилається кадр, що складається лише з байта 0xFF з наступним байтом 0x00, щоб попросити, щоб інший одноранговий закрив з'єднання.
Якщо ви пишете сервер, вам слід обов’язково надіслати закритий кадр, коли сервер закриває клієнтське з'єднання. Звичайний метод закриття TCP-розетки іноді може бути повільним, а додатки вважають, що з'єднання все ще відкрите, навіть коли його немає.
Веб-переглядач дійсно повинен це зробити для вас, коли ви закриваєте або перезавантажуєте сторінку. Однак ви можете переконатися, що закритий кадр надісланий, зробивши захоплення події перед завантаженням:
window.onbeforeunload = function() {
websocket.onclose = function () {}; // disable onclose handler first
websocket.close();
};
Я не впевнений, як ви можете отримувати подію на закриття після оновлення сторінки. Об'єкт websocket (з обробником onclose) більше не буде існувати, коли сторінка перезавантажується. Якщо ви відразу намагаєтеся встановити підключення WebSocket на своїй сторінці під час завантаження сторінки, можливо, ви зіткнулися з проблемою, коли сервер відмовляється від нового з'єднання так скоро після відключення старого (або браузер не готовий щоб встановити з'єднання в точці, до якої ви намагаєтесь з'єднатися), і ви отримуєте подію закриття для нового об’єкта websocket.
onclose
подія запускається несподівано або, можливо, спеціально, коли користувач пересувається / перезавантажується сторінка. Я розмістив запитання із запитанням, якою має бути очікувана поведінка, який браузер має право та як ми реалізуємо автоматичне відновлення.