Selon le spécification du protocole v76 (qui est la version que les navigateurs avec le support actuel implémentent) :
Pour fermer la connexion proprement, une trame consistant en un simple octet 0xFF suivi d'un octet 0x00 est envoyée par un pair pour demander que l'autre pair de fermer la connexion.
Si vous écrivez un serveur, vous devez vous assurer d'envoyer une trame de fermeture lorsque le serveur ferme une connexion client. La méthode normale de fermeture des sockets TCP peut parfois être lente et amener les applications à penser que la connexion est toujours ouverte alors qu'elle ne l'est pas.
Le navigateur devrait vraiment le faire pour vous lorsque vous fermez ou rechargez la page. Cependant, vous pouvez vous assurer qu'un cadre de fermeture est envoyé en capturant l'événement beforeunload :
window.onbeforeunload = function() {
websocket.onclose = function () {}; // disable onclose handler first
websocket.close();
};
Je ne vois pas comment vous pouvez obtenir un événement onclose après le rafraîchissement de la page. L'objet websocket (avec le gestionnaire onclose) n'existera plus lorsque la page sera rechargée. Si vous essayez d'établir une connexion WebSocket sur votre page dès son chargement, il se peut que le serveur refuse une nouvelle connexion si tôt après la déconnexion de l'ancienne (ou que le navigateur ne soit pas prêt à établir des connexions au moment où vous essayez de vous connecter) et que vous obteniez un événement onclose pour le nouvel objet websocket.