socket.io forzar una desconexión sobre el sondeo XHR

Tengo una aplicación cliente / servidor que utiliza nodejs en el servidor y socket.io como mecanismo de conexión. Por razones relevantes para mi aplicación, quiero tener solo una conexión activa por navegador y rechazar todas las conexiones de otras tabs que puedan abrirse posteriormente durante la sesión. Esto funciona muy bien con WebSockets, pero si el navegador no admite WebSockets y en su lugar se utiliza el sondeo XHR, la desconexión nunca ocurre, por lo que si el usuario simplemente actualiza la página, esto no se interpreta como una reconexión (tengo un retraso para reconexión y restauración de la sesión), pero como una nueva pestaña, que finaliza cuando la conexión se rechaza porque la conexión anterior realizada por esta misma pestaña aún está activa.

Estoy buscando una manera de finalizar efectivamente la conexión desde el cliente cada vez que se produce una actualización. He intentado enlazar la beforeunload y llamar a socket.disconnect() en el lado del cliente, y también enviar un mensaje como socket.emit('force-disconnect') y desencadenar la desconexión del servidor sin éxito. ¿Me estoy perdiendo de algo? ¡Aprecio tu ayuda!

He leído esta pregunta y no la encontré útil para mi caso particular.

Resuelto el problema, resulta que fue un error introducido en socket.io 0.9.5 . Si tiene este problema, simplemente actualice AMBOS códigos de servidor y del lado del cliente a socket.io > 0.9.9 y establezca la sync disconnect on unload opciones del lado del cliente de socket.io sync disconnect on unload y listo.

Las opciones se establecen de esta manera:

 var socket = io.connect('http://yourdomain.com', {'sync disconnect on unload' : true}); 

También puede obtener “Error: xhr poll error” si se queda sin descriptores de archivos abiertos disponibles. Es probable que esto suceda durante una prueba de carga.

Verifique el tamaño del descriptor de archivo abierto actual:

 ulimit -n 

Auméntalo a un número alto:

 ulimit -n 1000000 
    Intereting Posts