Lo que pasa es que hay dos versiones principales de protocolo de WebSockets en uso en la actualidad. La versión anterior que usa el protocolo [0x00][message][0xFF]
, y luego está la nueva versión que usa Hybi con formato de paquetes.
La versión de protocolo anterior es utilizada por Opera y iPod/iPad/iPhones por lo que es realmente importante que la compatibilidad con versiones anteriores se implemente en los servidores de WebSockets. Con estos navegadores utilizando el protocolo anterior, descubrí que al actualizar la página, o al navegar fuera de la página, o al cerrar el navegador, todo da como resultado que el navegador cierre automáticamente la conexión. ¡¡Estupendo!!
Sin embargo, con los navegadores que usan la nueva versión de protocolo (por ejemplo, Firefox, Chrome y finalmente IE10), solo cerrar el navegador hará que el navegador cierre automáticamente la conexión. Es decir, si actualiza la página o navega fuera de la página, el navegador NO cierra automáticamente la conexión. Sin embargo, lo que hace el navegador es enviar un paquete hybi al servidor con el primer byte (el identificador de proto) como 0x88
(mejor conocido como el marco de datos cerrado). Una vez que el servidor recibe este paquete, puede cerrar forzosamente la conexión, si así lo desea.
Es posible que en Firefox la conexión parezca estar en la carga de la página siguiente. No puedo encontrar una referencia, pero creo que puede haber un error al respecto. La otra posibilidad es que el evento 'onclose' se active inesperadamente, o tal vez a propósito, a medida que el usuario navega/página se vuelve a cargar. He [publicado una pregunta] (http://stackoverflow.com/questions/10965720/should-websocket-onclose-be-triggered-by-user-navigation-or-refresh) preguntando cuál debería ser el comportamiento esperado, que navegador tiene razón y cómo implementamos la reconexión automática. – leggetter
considere [estos problemas] (http://stackoverflow.com/questions/14645011/window-onbeforeunload-and-window-onunload-is-not-working-in-firefox-safari-o) con el evento 'onbeforeunload' – artkoenig