J'ai configuré socket.io v.1.4.5 w express et je n'ai pas pu retracer la raison des déconnexions inexplicables sur les clients. La raison donnée par l'événement de déconnexion sur le client est « fermeture du transport ». Cela arrive très régulièrement sur certains clients.
Y a-t-il une explication au fait qu'un client obtienne des déconnexions de "transport proche" sur ce qui semble être un intervalle de temps ? Le client se reconnecte très bien, mais cela cause un inconvénient extrême car cela se produit si fréquemment.
J'ai essayé divers paramètres, comme changer le pingInterval, le pingTimeout et le port pour les websockets (j'utilise maintenant le port 80). Mais peu importe ce que je semble faire, le problème ne disparaît jamais.
Mise à jour vers socket.io v2.0.3. et toujours le problème. Cela ne semble se produire que sur un de mes PC. J'ai également désactivé le pare-feu Windows, mais le problème persiste.
Passé à ws (https://github.com/websockets/ws) qui impliquait des réécritures massives, mais j'utilise maintenant l'objet navigateur websocket natif du côté client et tout fonctionne parfaitement. Je n'ai plus le problème. Adieu socket.io !
Vivre la même chose. Je ne veux vraiment pas avoir à subir une réécriture. Quelqu'un a-t-il du succès avec ce problème?
J'étais vraiment fatigué de ce problème.
Je pense que vous devriez vérifier la version de "socket.io" avec "socket.io-client".
si la version serveur / client ne correspond pas, la connexion était très instable.
Je recommande simplement d'utiliser CDN comme ci-dessous pour le client.
@ref: https://cdnjs.com/libraries/socket.io
I hope it helps.
Dév. Guerres féodales ?? C'est super.
J'ai aussi ce problème.
L'utilisateur a été déconnecté de manière aléatoire en raison de la fermeture du transport et du délai d'expiration du ping.
J'ai aussi essayé de changer de nombreuses options (intervalle de ping, timeout de ping, transfert...) mais cela ne fonctionne pas.
J'ai vérifié la version du socket.io du serveur et du client
Beaucoup de gens souffrent de ce problème, mais je ne trouve aucune solution.
Des nouvelles sur ce problème, car j'ai exactement le même problème!
J'ai également le même problème lorsque je déploie sur k8ns, mais lorsque je l'exécute localement, cela fonctionne bien.
J'en souffre aussi...
@talas9 @muhammadnasr @htamop les questions courantes pour pouvoir déboguer / reproduire le problème :
Merci!
Je l'ai essayé avec le client et le serveur 2.1.0 et 2.0.4. Sur chrome et safari (dernier).
Lorsque j'exécute localement, cela fonctionne bien (peut être connecté pendant plus d'une heure sans déconnexion), mais lorsque je déploie sur K8ns derrière l'équilibreur de charge d'entrée, ce problème se produit ...
Pour info, la connexion est fermée exactement après 25 secondes à chaque fois, voir capture d'écran
@talas9 @htamop @dnwldbs84 utilisez-vous un équilibreur de charge ?
@darrachequesne Quel(s) équilibreur(s) de charge recommandez-vous d'utiliser avec socket.io ?
@muhammadnasr @darrachequesne
J'ai utilisé le serveur 2.1.0 et le client 1.0.0 (android)
Je dois maintenir la connexion stable pendant 8 à 9 heures, mais elle se déconnecte de manière inattendue.
J'ai changé les deux versions en 1.7.4 et 0.8.3 ? selon un autre poste de solution. je vais essayer de tester si ça marche bien demain
Je n'avais pas utilisé d'équilibreur de charge. Le client et le serveur ont tous deux utilisé la version 2.0.3 de Socket.io (je ne me souviens pas de toutes les versions que j'ai utilisées). Je ne sais pas quel navigateur est à l'origine du problème. Cependant, la plupart des utilisateurs ont utilisé Chrome. Dans mon cas, la déconnexion était aléatoire, donc elle ne peut pas se reproduire.
Et j'ai changé pour ws. Je ne sais pas si le problème est résolu.
@muhammadnasr @darrachequesne @dnwldbs84
Je pense que c'est résolu dans mon cas.
J'utilise 0.8.3 socket.io-client dans le service de premier plan Android (api 26) et la version 1.3.5 dans le serveur nodejs.
Cependant, le problème n'est peut-être pas la version.
J'ai changé pingInterval dans le serveur à 10 ms et il semble fonctionner correctement (le délai d'expiration du ping et la fermeture du transport ne se sont pas produits)
var io = require('socket.io')(http, {pingInterval: 10, pingTimeout: 4000 });
10 millisecondes est trop étroit, de cette façon le réseau sera submergé.
10 millisecondes, c'est trop étroit, de cette façon le réseau sera submergé.
Correct!
@muhammadnasr tout équilibreur de charge devrait fonctionner. Veuillez consulter les exemples suivants :
Sticky-session est cependant requis, si vous activez l'interrogation (qui est la valeur par défaut).
@darrachequesne J'ai le même problème, après environ 8 à 9 heures, la prise se déconnecte avec la raison de "fermeture du transport"
J'utilise:
Chrome: 61.0.3163.100
Electron: 2.0.2
Socket.io: 2.1.1
J'ai eu le même problème, j'ai pu le résoudre en utilisant CDN à partir de ce commentaire https://github.com/socketio/socket.io/issues/3025#issuecomment -329024833 et en définissant le délai d'attente et l'intervalle comme ci-dessous :
io.set('heartbeat timeout', 60000);
io.set('heartbeat interval', 25000);
Hey,
Nous avons le même problème avec socket.io lorsqu'il s'exécute sous Kubernetes et NGINX Ingress Controller.
Lorsque la configuration de nginx est rechargée, elle recrée le processus et toutes les communications existantes sont supprimées, ce qui a causé le transport close
, tout autre déploiement qui utilise le contrôleur d'entrée peut provoquer le rechargement de la configuration
Tout d'abord merci pour ce super projet.
Même problème ici, peut-être que je t'apporterai quelque chose de nouveau.
J'ai un serveur ws et un client ws sur le nœud js.
Ce client ws est utilisé à partir d'une application node js où se trouve un service (micro service).
D'autres clients ws des navigateurs Web (des applications clientes) communiquent via le serveur ws avec ce service node js.
Tout fonctionne comme prévu.
Sur les stress tests maintenant (10 clients demandent intensivement des données), à la fin des tests, lorsque tous les jobs et transactions ont été terminés, la connexion du service est fermée avec l'erreur "transport close". Cela ne se produit pas toujours.
Voici la config du serveur :
pingTimeout : 15000,
pingInterval: 20000,
Il semble que pendant la charge lourde, certains pings soient perdus... ? ou je ne sais pas.
Est-ce quelque chose à quoi je dois m'attendre ?
De plus, avec la configuration par défaut pingTimeout: 2000, j'obtenais cette erreur au milieu du test de résistance. C'était également complètement inattendu, mais disons que le serveur était surchargé et n'a pas pu répondre dans les 2 secondes (!) Et nous pourrions obtenir cette erreur. Mais maintenant avec pingTimeout : 15000 ça arrive à presque 50% et seulement après la fin des tests.
Hmho, je pense que les micro-services devraient s'attendre à ce genre d'erreurs, même s'ils s'exécutent sur le même réseau local, mais la question est pourquoi cela se produit-il ?
J'ai essayé de créer une petite configuration pour reproduire ce problème mais je n'y suis pas parvenu.
Comment activer les logs ? le DEBUG=socket.io* ne fonctionne pas. Bien que la variable soit définie, je n'obtiens aucune sortie.
Je crois fermement que cela est lié à #2924.
Les reconnexions sur un client sont causées par certains navigateurs (safari et chrome) qui ralentissent les onglets inactifs pour économiser la batterie.
Cela entraîne des messages de pulsation retardés du client et du serveur fermant la connexion en raison de pingTimeout.
L'augmentation de pingTimeout fonctionne dans une certaine mesure, mais je reçois toujours des reconnexions dans un environnement de production.
J'ai également le même problème lorsque je déploie sur k8ns, mais lorsque je l'exécute localement, cela fonctionne bien.
@muhammadnasr où avez-vous pu surmonter le problème de déploiement sur K8 ? Je rencontre des problèmes similaires.
@ bheema01 assurez-vous simplement que stickysession est activé sur votre proxy/loadbalancer et cela devrait fonctionner
J'ai la même erreur
Même problème ..... les clients se connectent et se déconnectent à plusieurs reprises lorsque le point de terminaison de socket côté serveur se trouve derrière un équilibreur de charge. Même après avoir configuré les sessions persistantes, le problème persiste. @muhammadnasr avez -vous pu résoudre le problème.
J'ai vu cette erreur, lorsque le fil a été bloqué fréquemment pendant plus de 200 ms.
Si cela se produit fréquemment, cela est mauvais pour le socket.io _et pour votre application également_.
Le socket.io a un délai d'attente pour vérifier le rythme cardiaque de la connexion.
Si ce délai est dépassé, la connexion s'arrête et nous obtenons cette erreur.
@varunSabnis après avoir passé .
@dennisat J'ai essayé de vérifier combien de temps il a fallu à mon client pour recevoir un paquet de pong. À chaque fois, c'était au-delà de 200 ms, ce qui a été testé à la fois avec le serveur de socket dans le cloud et le serveur de socket sur mon hôte local. La configuration locale ne déconnecte pas le socket (tout fonctionne bien), alors que dans le cloud, le socket se connecte et se déconnecte continuellement. Donc, je ne pense pas que ce soit le problème.
@muhammadnasr d' accord, c'est super. Je l'ai activé, mais j'ai toujours des problèmes.
@muhammadnasr @darrachequesne @dnwldbs84
Je pense que c'est résolu dans mon cas.
J'utilise 0.8.3 socket.io-client dans le service de premier plan Android (api 26) et la version 1.3.5 dans le serveur nodejs.
Cependant, le problème n'est peut-être pas la version.
J'ai changé pingInterval dans le serveur à 10 ms et il semble fonctionner correctement (le délai d'expiration du ping et la fermeture du transport ne se sont pas produits)
var io = require('socket.io')(http, {pingInterval: 10, pingTimeout: 4000 });
Cela fonctionne comme par magie, merci !!!!!!!
Je trouve que j'ai un "transport proche" à chaque intervalle de ping.
J'étais vraiment fatigué de ce problème.
Je pense que vous devriez vérifier la version de "socket.io" avec "socket.io-client".
si la version serveur / client ne correspond pas, la connexion était très instable.Je recommande simplement d'utiliser CDN comme ci-dessous pour le client.
@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
Enfin, je découvre que c'est à cause de la non-concordance des versions du client et du serveur.
Tout fonctionne bien maintenant lorsque je fais en sorte que le client et le serveur partagent la même version de socket.io.
Je pense que la logique de ping-pong peut différer dans différentes versions de socket.io, et le serveur n'a pas reçu l'événement ping du côté client dans l'intervalle de ping, ce qui donne le message « fermeture du transport ».
J'ai rencontré le problème de déconnexion socket.io toutes les 30 secondes après le déploiement sur Google Cloud Platform (GCP). Il s'est avéré qu'il s'agissait d'un délai d'attente http par défaut utilisé par Global Load Balancer. La documentation GCP indique que vous devez modifier la valeur lorsque vous utilisez des Websockets. Les instructions pour modifier le paramètre sont ici :
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting
toujours confronté au même problème sur "socket.io": "2.2.0",
"socket.io-client": "2.2.0",
socket.io- client:socket close (délai de ping) +22s
Pareil ici. Le serveur local n'a jamais de problème. Mais lors du déploiement derrière un équilibreur de charge, le délai d'expiration du ping est aléatoire. Probablement 1 fois sur 50. J'ai essayé d'utiliser la version CDN et d'ajouter la session persistante. Le problème existe toujours.
Rien n'a fonctionné pour moi à part une logique de reconnexion personnalisée. Si le client obtient un événement d'ouverture de socket avec un identifiant différent du précédent, envoyez au serveur un événement de reconnexion avec l'ancien et le nouveau identifiant. Ensuite, sur le serveur, mettez simplement à jour l'identifiant du socket du joueur et renvoyez l'état du jeu.
@tmusaev pourriez-vous publier cette logique de reconnexion personnalisée pour le client ?
J'ai le même problème : 'transport close'
avoir le même problème. enfin je le résous. Nginx est mon serveur proxy, mais proxy_read_timeout
of config est 60s , cela indique que si le client ou le serveur n'émet aucun message dans les 60s , nginx se déconnectera , nous pouvons donc obtenir ce transport close
errorMsg.
la solution:
proxy_read_timeout
à 600 ou plussetInterval
pour envoyer un message au Front-end"react": "16.8.3",
"react-native": "^0.59.9",
"socket.io": "^2.2.0"
J'ai utilisé cette bibliothèque pour discuter et pour obtenir des événements. Cela fonctionne bien sous iOS mais crée un problème sous Android. Il a perdu la connexion socket à tout moment et se reconnecte. Il affiche en permanence le même comportement. et également donner cette erreur de fermeture de transport ou de délai d'attente de ping
"react": "16.8.3", "react-native": "^0.59.9", "socket.io": "^2.2.0"
J'ai utilisé cette bibliothèque pour discuter et pour obtenir des événements. Cela fonctionne bien sous iOS mais crée un problème sous Android. Il a perdu la connexion socket à tout moment et se reconnecte. Il affiche en permanence le même comportement. et également donner cette erreur de fermeture de transport ou de délai d'attente de ping
+1
Dans notre cas, le problème est causé par le proxy CDN. J'ai résolu ce problème en connectant socket.io au site d'origine qui n'était pas proxy CDN.
Nous avons résolu ce problème en mettant à jour le contrôleur d'entrée nginx !
Après avoir lu plusieurs commentaires sur différents fils de discussion, j'ai essayé à peu près toutes les suggestions faites afin d'atténuer ce problème de fermeture de transport . Malgré les versions que j'utilise sur le client/serveur (actuellement 2.0.3), j'obtiens ce comportement une fois que je déploie mes microservices à l'aide de Kubernetes.
Actuellement, le serveur a la configuration suivante :
Comme d'autres l'ont mentionné, chaque fois que j'exécute l'application localement, il n'y a pas de déconnexion. J'ai lu sur un autre fil que la version 3 pour socket.io changera le ping/pong donc c'est fait pour le serveur et cela pourrait aider à résoudre ce problème. Quelqu'un a-t-il des nouvelles ou des mises à jour concernant ce problème ou une date possible pour cette nouvelle version ?
J'ai vu cette erreur, lorsque le fil a été bloqué fréquemment pendant plus de 200 ms.
Si cela se produit fréquemment, cela est mauvais pour le socket.io _et pour votre application également_.
Le socket.io a un délai d'attente pour vérifier le rythme cardiaque de la connexion.
Si ce délai est dépassé, la connexion s'arrête et nous obtenons cette erreur.
Pour ceux qui utilisent Socket.IO pour envoyer de grandes quantités de données, assurez-vous de le faire d'une manière qui ne bloque pas le thread. J'ai rencontré cela aujourd'hui en utilisant le client socket sur React Native et je l'utilise pour envoyer des fichiers au serveur. En raison de la façon dont nous avons écrit l'envoi de fichiers via le socket, qui est essentiellement tout-en-un au lieu de séquentiellement, le thread JS est bloqué et ne peut pas renvoyer un pong au serveur, le déconnectant, nous donnant ceci Erreur.
J'ai le même problème sur mon application, je ne pense pas que ce soit un problème de ping-pong. Je doute qu'il s'agisse d'un problème causé par le côté serveur qui a fermé le transport du socket.
Le même problème. Dans un navigateur angulaire.
Cette configuration a considérablement réduit le nombre de reconnexions :
J'ai utilisé forceJSONP à cause de cors
Après mon analyse, j'ai trouvé le problème ci-dessous
PROBLÈME:
Les sockets fonctionnent correctement sans aucune déconnexion localement, mais lorsqu'ils sont déployés dans des environnements, les sockets se déconnectent avec "transport close" comme raison de déconnexion.
J'ai vu ce problème uniquement lors de l'exécution de l'application de nœud à l'aide d'un service parvenu ou d'un service systemmd, si nous exécutons l'application comme node app.js, je ne vois PAS ce problème.
SOLUTION SIMPLE / SOLUTION DE CONTOURNEMENT :
Côté client, lors de la déconnexion du socket, le socket émet ajoute un utilisateur (angulaire 11)
self.socket.on('disconnect', (reason) => {
if(currentUser){
self.socket.emit('add user', currentUser);
}
})
Avec le scénario ci-dessus, tous les utilisateurs sont toujours connectés et en ligne, seront déconnectés lors de la déconnexion
Commentaire le plus utile
J'ai rencontré le problème de déconnexion socket.io toutes les 30 secondes après le déploiement sur Google Cloud Platform (GCP). Il s'est avéré qu'il s'agissait d'un délai d'attente http par défaut utilisé par Global Load Balancer. La documentation GCP indique que vous devez modifier la valeur lorsque vous utilisez des Websockets. Les instructions pour modifier le paramètre sont ici :
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting