2012-08-04 16 views
15

Tengo una aplicación web, que se ejecuta en un navegador. Esa aplicación web está conectada a un servidor que usa websockets. Entonces la comunicación entre el servidor y mi cliente/navegador se basa en websockets. Si ocurre algún evento mágico en el servidor, algunos servicios web envían un nuevo XML/JSON a mi aplicación web y se muestran los nuevos datos.¿Cómo sé si la conexión está activa con websockets?

Pero, ¿cómo puedo saber, como cliente/navegador, si la conexión aún está activa? Digamos que no recibo ningún XML nuevo durante unos 30 segundos. Cómo sabría si la conexión está cerrada/interrumpida/servidor fuera de línea o si todo está bien, pero en el servidor no se produjo ningún evento mágico nuevo.

Respuesta

18

3 maneras:

  • se basan en TCP para detectar la pérdida de conectividad, que en última instancia aparecer en JS OnClose caso
  • pings enviar desde el servidor WebSocket .. navegadores responder con pongs WS, la pérdida de la conectividad es probablemente detectada de forma más robusta también en el lado del cliente
  • envía heartbeats de nivel de aplicación del navegador al servidor, el servidor debe tener lógica para responder. no se puede desencadenar pings WS desde los navegadores (en JS) objeto de conexión
+0

¿No hay nada definido en la norma? ¿O tengo que hacer todo el "trabajo" manualmente? – Gero

+0

El estándar proporciona una forma de detectar y notificar los puntos finales de las fallas de conexión relacionadas con TCP (que suele incluir muchos casos de problemas de servidor). Si desea poder detectar fallas antes de que TCP lo descubra o las condiciones de error donde la conexión TCP está activa pero el servidor no está procesando mensajes, deberá hacerlo manualmente. – zaphoyd

+0

ok lo entiendo, pero parece un poco vago. Parece que hay 7 caminos diferentes a Roma. – Gero

22

Un WebSocket tiene un campo readyState que le dirá si la conexión está todavía activo (from the dart documentation). El readyState puede ser cualquiera

0 - connection not yet established 
1 - conncetion established 
2 - in closing handshake 
3 - connection closed or could not open 

También puede definir un controlador de eventos para el evento WebSocket close si esto es algo que le gustaría manejar (intentar volver a conectar, etc).

+7

ReadyState no cambia al desconectarse – megawac

+1

Para cualquiera que mire el comentario anterior: En mi experiencia, cerrar el socket con socket.close() cambiará el estado listo – Brandon

+0

Sí, estoy de acuerdo con Brandon, cuando cierra la conexión se muestra "3" –

Cuestiones relacionadas