socket nodejs ejemplo event-handling websocket reconnect

event-handling - nodejs - websocket javascript ejemplo



¿Se debe activar WebSocket.onclose por la navegación del usuario o actualizar? (2)

Parte 1: ¿Comportamiento esperado?

Estoy viendo un comportamiento de navegador inconsistente entre Firefox y Chrome en relación con el controlador onclose está llamando.

Parece que Chrome no onclose un onclose si fue causado por la navegación / actualización de una página de usuario. Sin embargo, Firefox dispara el onclose .

Me parece que Firefox puede estar comportándose correctamente aquí:

Cuando la conexión WebSocket está cerrada, posiblemente limpiamente, el agente de usuario debe crear un evento que use la interfaz CloseEvent, con el nombre del evento cerrado, que no burbujea, no se puede cancelar, no tiene una acción predeterminada, cuyo atributo wasClean se establece en verdadero si la conexión se cerró limpiamente y falso de lo contrario, cuyo atributo de código se establece en el código de cierre de la conexión de WebSocket, y cuyo atributo de razón se establece en el motivo de cierre de la conexión de WebSocket; y ponga en cola una tarea para cambiar primero el valor del atributo readyState a CERRADO (3), y luego enviar el evento al objeto WebSocket.

Fuente: http://www.w3.org/TR/2011/WD-websockets-20110419/#closeWebSocket

A pesar de que puede llevar a algún código astuto / comportamiento inesperado .

¿Alguien puede confirmar el comportamiento esperado?

Parte 2: ¿Cómo implementar la reconexión automática?

Si tiene una biblioteca que se reconecta automáticamente para el usuario, ¿cómo sabe si debe intentar volver a conectarse? ¿Verifica la propiedad CloseEvent.wasClean ? ¿Debo suponer que ''limpio'' significa que se suponía que el cierre se debía a una llamada de API a WebSocket.close() o al servidor que enviaba un marco cerrado? Si un error de red provoca el cierre, wasClean que wasClean sería false .

En la biblioteca de JavaScript de Pusher asumimos (onclose -> waiting -> connection) que un cierre debería desencadenar una reconexión a menos que estemos en un estado de cierre, el desarrollador ha elegido cerrar la conexión. Parece que la biblioteca del cliente socket.io hace la misma suposición.

En base a esto, el evento onclose de Firefox causado por la navegación / actualización del usuario desencadena una reconexión no deseada porque ninguna biblioteca verifica la propiedad CloseEvent.wasClean .

Ejemplo y Video

Aquí hay un ejemplo que puede usar para demostrar la inconsistencia: http://jsbin.com/awonod/7

Aquí hay un video de mí que demuestra el problema: http://www.screenr.com/vHn8 (es tarde, ignora el par de errores) :)

Un punto a tener en cuenta es que al presionar la tecla Escape también podría estar causando el cierre de la conexión WebSocket. Sin embargo, si observa de cerca o lo intenta por sí mismo, verá que el evento de cierre se registra justo antes de que se actualice la página.


El comportamiento inesperado se debe a la forma en que Firefox y Chrome manejan el cierre de un Websocket. Cuando se actualiza la página, ambos navegadores cierran la conexión, sin embargo, Firefox ejecutará su código de cierre, mientras que Chrome cierra la conexión y salta directamente para volver a cargar la nueva página. Así que sí, confirmo este extraño comportamiento.
Aún más extraño es el hecho de que, según mis observaciones, llamar a websocket.close () en chrome cerrará inmediatamente la conexión y llamará a la función onclose, mientras que Firefox espera un mensaje cercano del servidor.

La propiedad wasClean será verdadera si se recibió un mensaje de cierre del servidor

Si su biblioteca se reconecta automáticamente sin verificar la propiedad wasClean, esto podría causar un problema, ya que intenta restablecer la conexión a medida que se actualiza la página. Debería considerar no usar la biblioteca para esto y hacerlo manualmente, no debería ser muy difícil, simplemente llame a connect en la función onclose con una instrucción if asegurándose de que la propiedad onclean sea verdadera. O para ser aún más seguro, establezca una variable en la descarga antes de la instalación que impida cualquier nueva conexión.

¡espero que esto ayude!


Tengo pocas palabras para añadir,

Cuando actualice la página, se llamará al evento ''onclose'', y la mayoría de los navegadores funcionarán de forma síncrona, si el navegador funciona de forma asíncrona, entonces solo se cerrará.

Aquí, significa sincrónico conectado cuando sea necesario (actualización / navegación).

Medios asíncronos conectados siempre. Así que tendremos que webSocket. abierto siempre

https://developer.mozilla.org/@api/deki/files/6227/=AsyncUnload.jpg

Referencia de cierre de evento de la red Mozilla

Web Socket

Aquí también encontrará la respuesta a ''wasClean'', es decir, completamente cerrada.

Espero que esto se sume ...