2011-06-08 22 views
6

Estoy trabajando con socket.io y node.js. Estoy teniendo problemas para rastrear qué usuarios están en línea debido a los pocos segundos de retraso antes de que el socket IO reconozca que un cliente de XHR-Polling se ha desconectado.Socket.IO: Retraso XHR-Polling en la desconexión

Si un cliente XHR-Polling actualiza la página, su nuevo mensaje de conexión parece preceder a su mensaje de desconexión. Esto causa confusión al intentar rastrear qué usuarios están en línea.

Una solución podría ser detectar el método de transporte en el servidor y retrasar la conexión para los clientes de XHR-Polling para garantizar que las funciones de desconexión se hayan ejecutado primero.

¿Alguien ha tenido alguna experiencia al respecto?

+2

¿Por qué no puede suponer que un usuario está en línea hasta que se dispare el evento de desconexión? Estoy de acuerdo en que habrá una superposición en la que parecerá que dos usuarios están en línea cuando solo uno lo está, pero si identifica las conexiones de acuerdo con ciertos ID de usuario, entonces no debería haber un problema. Y si no, el peor de los casos es que un usuario aparezca en línea durante unos segundos más. No creo que agregar un retraso sea una forma particularmente sólida de realizar una buena detección de desconexión. – davin

+0

Estoy de acuerdo con Davin.Utilizo esos "esta persona está en línea" como las mejores estimaciones de que la persona está en línea en ese momento, no como una ley. Si quiero saber lo que están haciendo, los llamaré. – jcolebrand

+0

Esto es algo para lo que hemos agregado soporte en [Pusher] (http://pusher.com) y lo hacemos utilizando algo llamado [Canales de presencia] (http://pusher.com/docs/presence). – leggetter

Respuesta

3

El principal problema con la presencia, como @davin y @jcolebrand señalan en los comentarios, es que las conexiones por sí solas no se pueden confiar. Los dispositivos de red pueden aferrarse a las conexiones después de que un usuario haya navegado fuera de una página. Entonces, necesitas algo más para confirmar la presencia de un usuario.

Esto es algo para lo que hemos agregado soporte en Pusher y lo hacemos usando algo llamado Presence Channels.

Gestionamos esto utilizando una identificación de usuario única, que usted (el desarrollador) debe proporcionar cuando un usuario se conecta, en combinación con un id único de socket que identifica la conexión. Dado que este ID de usuario único solo puede aparecer una vez dentro de una lista de miembros de presencia, significa que ese usuario solo se mostrará una vez, incluso si tienen varias conexiones abiertas y, por lo tanto, conexiones de socket múltiples.

La misma idea se puede aplicar a las conexiones HTTP.

El enfoque general para esto es usar la sesión para identificar al usuario de manera única. De esta forma, incluso si solo son un "Invitado", puede identificarlos siempre que permitan el uso de cookies.

Por lo tanto, el número de usuarios en su sistema debería ser como máximo el máximo de sesiones activas que tenga en ejecución en su servidor.

Espero que esto ayude. Avísame si quieres aclarar algo.

1

Estoy desarrollando una solución de soporte de chat y el asistente debe saber cuándo se conecta un cliente. Con websocket funciona bien, pero con whr-pooling, a veces el asistente simplemente se desconecta (con 5 segundos en algunos casos). A veces no te gusta. Lo que hago: acabo de ingresar a la página y esperar a mirar la aplicación de la terminal.

estoy usando nodejs, nowjs

1

¿Qué versión de socket.io está usando? Encontré este problema y lo resolvió on this post. Resulta que se introdujo un error en socket.io 0.9.5 en la solicitud enviada cuando se desencadenó el evento beforeunload que impidió la desconexión adecuada.