He configurado socket.io v.1.4.5 w express y no he podido rastrear el motivo de desconexiones inexplicables en los clientes. El motivo dado por el evento de desconexión en el cliente es "cierre de transporte". Sucede de manera muy constante en algunos clientes.
¿Existe alguna explicación para que un cliente obtenga desconexiones de "transporte cercano" en lo que parece ser un intervalo cronometrado? El cliente se vuelve a conectar bien, pero causa un inconveniente extremo porque sucede con mucha frecuencia.
Probé varias configuraciones, como cambiar pingInterval, pingTimeout y el puerto para websockets (ahora estoy usando el puerto 80). Pero no importa lo que parezca que hago, el problema nunca desaparece.
Actualizado a socket.io v2.0.3. y sigo teniendo el problema. Parece que solo sucede en una de mis PC. También desactivé el firewall de Windows, pero el problema sigue ocurriendo.
Cambié a ws (https://github.com/websockets/ws) que implicó reescrituras masivas, pero ahora uso el objeto del navegador websocket nativo en el lado del cliente y todo funciona perfectamente. Ya no tengo el problema. ¡Hasta luego socket.io!
Experimentar lo mismo. Realmente no quiero tener que pasar por una reescritura. ¿Alguien ha tenido éxito con este tema?
Estaba realmente cansado de este problema.
Creo que deberían comprobar la versión de "socket.io" con "socket.io-client".
si la versión del servidor / cliente no coincide, la conexión era muy inestable.
Recomiendo simplemente usar CDN como se muestra a continuación para el cliente.
@ref: https://cdnjs.com/libraries/socket.io
I hope it helps.
Desarrollador de Guerras Feudales Es genial.
Yo también tengo este problema.
El usuario se desconectó aleatoriamente debido al cierre del transporte y al tiempo de espera del ping.
También intenté cambiar muchas opciones (intervalo de ping, tiempo de espera de ping, transferencia ...) pero no funciona.
Verifiqué la versión del servidor y del cliente socket.io
Mucha gente sufre este problema, pero no puedo encontrar ninguna solución.
Cualquier noticia sobre este problema, ¡porque tengo exactamente el mismo problema!
También tengo el mismo problema cuando implemento en k8ns pero cuando ejecuto localmente funciona bien.
Yo también estoy sufriendo por esto ...
@ talas9 @muhammadnasr @htamop las preguntas comunes para poder depurar / reproducir el problema:
¡Gracias!
Lo he probado con cliente y servidor 2.1.0 y 2.0.4. En Chrome y Safari (más reciente).
Cuando ejecuto localmente, funciona bien (se puede conectar durante más de una hora sin desconectarlo), pero cuando implemento en K8ns detrás del balanceador de carga de entrada, ocurre este problema ...
Para su información, la conexión se cierra exactamente después de 25 segundos cada vez, vea la captura de pantalla
@ talas9 @htamop @ dnwldbs84 ¿está utilizando un equilibrador de carga?
@darrachequesne ¿Qué balanceador (es) de carga recomienda usar con socket.io?
@muhammadnasr @darrachequesne
Usé el servidor 2.1.0 y el cliente 1.0.0 (Android)
Necesito mantener la conexión estable durante 8 ~ 9 horas, pero se desconecta inesperadamente.
¿Cambié ambas versiones a 1.7.4 y 0.8.3? según otro puesto de solución. Intentaré probar si funciona bien mañana
No había usado un equilibrador de carga. Tanto el cliente como el servidor usaron la versión 2.0.3 de Socket.io (no recuerdo todas las versiones que usé). No sé qué navegador está causando el problema. Sin embargo, la mayoría de los usuarios han utilizado Chrome. En mi caso, la desconexión fue aleatoria, por lo que no se puede reproducir.
Y cambié a ws. No estoy seguro de que el problema esté resuelto.
@muhammadnasr @darrachequesne @ dnwldbs84
Creo que está resuelto en mi caso.
Utilizo 0.8.3 socket.io-client en el servicio de primer plano de Android (api 26) y la versión 1.3.5 en el servidor nodejs.
Sin embargo, es posible que el problema no sea la versión.
Cambié pingInterval en el servidor a 10ms y parece funcionar correctamente (el tiempo de espera del ping y el cierre del transporte no se produjeron)
var io = require ('socket.io') (http, {pingInterval: 10, pingTimeout: 4000});
10 milisegundos es demasiado estrecho, de esta manera la red se verá desbordada.
10 milisegundos es estrechar, de esta manera la red se verá desbordada.
¡Correcto!
@muhammadnasr, cualquier equilibrador de carga debería funcionar. Consulte los siguientes ejemplos:
Sin embargo, se requiere una sesión fija si habilita el sondeo (que es el predeterminado).
@darrachequesne tengo el mismo problema, después de 8 ~ 9 horas, el enchufe se desconecta con el motivo de "transporte cerrado"
Estoy usando:
Chrome: 61.0.3163.100
Electron: 2.0.2
Socket.io: 2.1.1
Tuve el mismo problema, pude solucionarlo usando CDN de este comentario https://github.com/socketio/socket.io/issues/3025#issuecomment -329024833 y estableciendo el tiempo de espera y el intervalo como se muestra a continuación:
io.set('heartbeat timeout', 60000);
io.set('heartbeat interval', 25000);
Oye,
Tenemos el mismo problema con socket.io cuando se ejecuta en Kubernetes y NGINX Ingress Controller.
Cuando se recarga la configuración de nginx, se recrea el proceso y se descartan todas las comunicaciones existentes, lo que provocó que transport close
, cualquier otra implementación que use el controlador de entrada podría provocar la recarga de la configuración
En primer lugar, muchas gracias por este increíble proyecto.
El mismo problema aquí, tal vez le traiga algo nuevo.
Tengo un servidor ws y un cliente ws en el nodo js.
Este cliente ws se usa desde una aplicación de node js donde hay un servicio (microservicio).
Otros clientes ws de navegadores web (de aplicaciones cliente) se comunican a través del servidor ws con este servicio de nodo js.
Todo está funcionando como se esperaba.
En las pruebas de estrés ahora (10 clientes están solicitando datos intensamente), al final de las pruebas, cuando todos los trabajos y transacciones han finalizado, la conexión del servicio se cierra con el error "transporte cerrado". Esto no sucede siempre.
Esta es la configuración del servidor:
pingTimeout: 15000,
pingInterval: 20000,
Parece que durante la carga pesada se pierden algunos ping ...? o no lo se.
¿Es esto algo que debería esperar?
Además, con la configuración predeterminada pingTimeout: 2000, recibí este error en medio de la prueba de esfuerzo. Esto también fue completamente inesperado, pero digamos que el servidor estaba sobrecargado y no pudo responder en 2 segundos (!) Y podríamos obtener este error. Pero ahora con pingTimeout: 15000 pasa casi el 50% y solo después del final de las pruebas.
Hmho, creo que los microservicios deberían esperar este tipo de errores, incluso si se ejecutan en la misma LAN, pero la pregunta es ¿por qué está sucediendo esto?
Intenté crear una pequeña configuración para reproducir este problema pero no pude hacerlo.
¿Cómo activar los registros? el DEBUG = socket.io * no funciona. Aunque la variable está configurada, no obtengo ningún resultado.
Creo firmemente que esto está relacionado con # 2924.
Las reconexiones en un cliente son causadas por algunos navegadores (safari y chrome) que aceleran los temporizadores de las pestañas inactivas para ahorrar batería.
Esto da como resultado mensajes de latido retrasados del cliente y el servidor que cierra la conexión debido a pingTimeout.
El aumento de pingTimeout funciona hasta cierto punto, pero aún obtengo reconexiones en un entorno de producción.
También tengo el mismo problema cuando implemento en k8ns pero cuando ejecuto localmente funciona bien.
@muhammadnasr, ¿ dónde pudo superar el problema de implementación en K8? Estoy experimentando problemas similares.
@ bheema01 solo asegúrese de tener stickysession habilitado en su proxy / loadbalancer y debería funcionar
Tengo el mismo error
El mismo problema ... los clientes se conectan y desconectan repetidamente cuando el extremo del socket del lado del servidor está detrás de un equilibrador de carga. Incluso después de configurar sesiones pegajosas, el problema persiste. @muhammadnasr pudieron resolver el problema.
He visto este error cuando el hilo se bloqueaba con frecuencia durante más de 200 ms.
Si esto sucede con frecuencia, es malo para socket.io _y también para su aplicación_.
El socket.io tiene un tiempo de espera para verificar el latido de la conexión.
Si se excede este tiempo de espera, se apaga la conexión y obtenemos este error.
@varunSabnis después de arreglar la sesión pegajosa, todo funcionó sin problemas.
@dennisat Intenté comprobar cuánto tiempo tardó mi cliente en recibir un paquete de pong. Cada vez fue más allá de 200ms, que se probó tanto con el servidor de socket en la nube como con el servidor de socket en mi localhost. La configuración local no desconecta el socket (todo funciona bien), mientras que en la configuración de la nube, el socket se conecta y desconecta continuamente. Entonces, no creo que ese sea el problema.
@muhammadnasr está bien, eso es genial. De hecho, lo he habilitado pero todavía tengo algunos problemas.
@muhammadnasr @darrachequesne @ dnwldbs84
Creo que está resuelto en mi caso.
Utilizo 0.8.3 socket.io-client en el servicio de primer plano de Android (api 26) y la versión 1.3.5 en el servidor nodejs.
Sin embargo, es posible que el problema no sea la versión.
Cambié pingInterval en el servidor a 10ms y parece funcionar correctamente (el tiempo de espera del ping y el cierre del transporte no se produjeron)
var io = require ('socket.io') (http, {pingInterval: 10, pingTimeout: 4000});
Funciona mágicamente, gracias !!!!!!!
Encuentro que tengo 'transporte cerca' cada intervalo de ping.
Estaba realmente cansado de este problema.
Creo que deberían comprobar la versión de "socket.io" con "socket.io-client".
si la versión del servidor / cliente no coincide, la conexión era muy inestable.Recomiendo simplemente usar CDN como se muestra a continuación para el cliente.
@ref: https://cdnjs.com/libraries/socket.io
I hope it helps.
It works even more magically.
Seems that we can close this issue with your answer, haha
Finalmente, me doy cuenta de que se debe a que la versión del cliente y del servidor no coincide.
Todo funciona bien ahora cuando hago que el cliente y el servidor compartan la misma versión de socket.io.
Creo que la lógica de ping pong puede diferir en diferentes versiones de socket.io, y el servidor no recibió el evento de ping del lado del cliente en el intervalo de ping, lo que da el mensaje de 'cierre de transporte'.
Encontré el problema de la desconexión de socket.io cada 30 segundos después de la implementación en Google Cloud Platform (GCP). Resultó ser un tiempo de espera http predeterminado utilizado por Global Load Balancer. La documentación de GCP dice que debes cambiar el valor al usar websockets. Las instrucciones para cambiar la configuración están aquí:
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting
todavía enfrenta el mismo problema en "socket.io": "2.2.0",
"socket.io-client": "2.2.0",
socket.io- cliente: cierre de
Aquí igual. El servidor local nunca tiene problemas. Pero cuando se implementa detrás de un equilibrador de carga, tiene un tiempo de espera de ping aleatorio. Probablemente 1 de cada 50 veces. Intenté usar la versión CDN y agregar la sesión permanente. El problema sigue existiendo.
Nada funcionó para mí además de una lógica de reconexión personalizada. Si el cliente recibe un evento de apertura de socket con una identificación diferente a la anterior, envíe al servidor un evento de reconexión con la identificación anterior y la nueva. Luego, en el servidor, simplemente actualice la identificación del socket del jugador y vuelva a enviar el estado del juego.
@tmusaev, ¿ podrías publicar esa lógica de reconexión personalizada para el cliente?
Tengo el mismo problema: 'transporte cerca'
tiene el mismo problema. finalmente lo resuelvo. Nginx es mi servidor proxy, pero proxy_read_timeout
de la configuración es 60 s, indica que si el cliente o servidor no emite ningún mensaje en 60 s, nginx se desconectará, por lo que podemos obtener ese transport close
errorMsg.
la solución:
proxy_read_timeout
a 600 o mássetInterval
para enviar algún mensaje en el front-end"react": "16.8.3",
"react-native": "^0.59.9",
"socket.io": "^2.2.0"
He usado esta biblioteca para charlar y para obtener algunos eventos. Funciona bien en iOS pero crea un problema en Android. Perdió la conexión del enchufe en cualquier momento y se volvió a conectar. Muestra continuamente el mismo comportamiento. y también dar a este cierre de transporte o error de tiempo de espera de ping
"react": "16.8.3", "react-native": "^0.59.9", "socket.io": "^2.2.0"
He usado esta biblioteca para charlar y para obtener algunos eventos. Funciona bien en iOS pero crea un problema en Android. Perdió la conexión del enchufe en cualquier momento y se volvió a conectar. Muestra continuamente el mismo comportamiento. y también dar a este cierre de transporte o error de tiempo de espera de ping
+1
En nuestro caso, el problema es causado por el proxy CDN. Resolví este problema conectando socket.io al sitio original que no tenía proxy de CDN.
¡Abordamos este problema actualizando el controlador de entrada nginx!
Después de leer varios comentarios sobre diferentes hilos, probé prácticamente todas las sugerencias hechas para mitigar este problema de cierre de transporte . A pesar de las versiones que uso en el cliente / servidor (actualmente 2.0.3), obtengo este comportamiento una vez que implemento mis microservicios usando Kubernetes.
Actualmente, el servidor tiene la siguiente configuración:
Como han mencionado otros, siempre que ejecuto la aplicación localmente no hay desconexión. He leído en un hilo diferente que la versión 3 de socket.io cambiará el ping / pong, por lo que está hecho para el servidor y esto podría ayudar a solucionarlo. ¿Alguien tiene alguna noticia o actualización con respecto a este problema o una posible fecha para esta nueva versión?
He visto este error cuando el hilo se bloqueaba con frecuencia durante más de 200 ms.
Si esto sucede con frecuencia, es malo para socket.io _y también para su aplicación_.
El socket.io tiene un tiempo de espera para verificar el latido de la conexión.
Si se excede este tiempo de espera, se apaga la conexión y obtenemos este error.
Para aquellos que usan Socket.IO para enviar grandes cantidades de datos, asegúrese de hacerlo de una manera que no bloquee el hilo. Encontré esto hoy usando el cliente de socket en React Native y lo estoy usando para enviar archivos al servidor. Debido a cómo escribimos el envío de archivos a través del socket, que es esencialmente todo en uno en lugar de secuencialmente, el hilo JS se ahoga y no puede enviar un pong al servidor, desconectándolo, dándonos esto error.
Tengo el mismo problema en mi aplicación, no creo que sea un problema de ping pong. Dudo que deba ser un problema por el lado del servidor que cerró el transporte del socket.
El mismo problema. En un navegador angular.
Esta configuración ha reducido considerablemente el número de reconexiones:
Usé forceJSONP debido a cors
Después de mi análisis, encontré el siguiente problema
ASUNTO:
Los sockets funcionan bien sin desconexiones a nivel local, pero cuando se implementan en entornos, los sockets se desconectan con "transporte cerrado" como motivo de desconexión.
Vi este problema solo cuando ejecuté la aplicación de nodo usando un servicio advenedizo o un servicio systemmd, si ejecutamos la aplicación como node app.js, NO veo este problema.
SOLUCIÓN SIMPLE / SOLUCIÓN ALTERNATIVA:
En el lado del cliente, al desconectar el zócalo, el zócalo emite agregar un usuario (angular 11)
self.socket.on('disconnect', (reason) => {
if(currentUser){
self.socket.emit('add user', currentUser);
}
})
Con el escenario anterior, todos los usuarios siempre están conectados y en línea, se desconectarán cuando cierren la sesión
Comentario más útil
Encontré el problema de la desconexión de socket.io cada 30 segundos después de la implementación en Google Cloud Platform (GCP). Resultó ser un tiempo de espera http predeterminado utilizado por Global Load Balancer. La documentación de GCP dice que debes cambiar el valor al usar websockets. Las instrucciones para cambiar la configuración están aquí:
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting