/ / Detectar conexión de WebSocket cerrada - Android, node.js, websocket

Detectar la conexión de WebSocket cerrada - Android, node.js, websocket

Estoy usando node.js y WebSocket-Node para construir un servidor websocket chat simple.

El cliente es una aplicación de Android.

El servidor tiene que comunicarse con los clientes de dos maneras:

  • Mensaje de websocket cuando el cliente está conectado (aplicación abierta en primer plano)
  • Notificaciones push usando Google GCM else

Pero hay un pequeño problema que necesito resolver ...

Cuando el cliente está conectado al servidor yla conexión a Internet se cae, el servidor no recibe una notificación al respecto porque el cliente no envió el marco de cierre. Por lo tanto, durante 10 segundos, el servidor cree que la conexión aún está activa.

Si en esos 10 segundos el servidor envía el mensaje a través del socket, el mensaje nunca podrá llegar al cliente.

Necesito detectar cuándo se cierra la conexión, u otra forma de enviar el mensaje usando GCM cuando se cierra la conexión.

¿Hay alguna manera?

Respuestas

1 para la respuesta № 1

Desde el lado del servidor, una desconexión impura (no se envían mensajes de desconexión) es indistinguible de una conexión muy lenta.

Lo que necesitas hacer es tener algún tipo delatido del corazón. WebSockets tiene pings en el nivel de protocolo para esto. Si su biblioteca lo expone, entonces configure el ping a un retraso que esté dispuesto a aceptar y agregue un controlador para cuando esto falle / no se complete después de un tiempo de espera.


1 para la respuesta № 2

Respondiendo a mi propia pregunta, porque: No es posible, y he encontrado otra forma mejor de manejar mi caso especifico.

  • Cuando el servidor envía un mensaje al cliente, éste responde al servidor para informar al servidor que el mensaje se ha entregado al cliente.
  • Si el servidor no recibe la respuesta del cliente después de un tiempo de espera, la conexión se considera cerrada.
  • Proceda a enviar el mensaje a través de GCM (o guárdelo para enviarlo nuevamente cuando el cliente vuelva a conectarse).