Ich habe socket.io v.1.4.5 w express eingerichtet und konnte den Grund für unerklärliche Verbindungsabbrüche auf den Clients nicht ermitteln. Der vom Disconnect-Ereignis auf dem Client angegebene Grund ist "Transport close". Bei einigen Clients passiert das sehr konstant.
Gibt es eine Erklärung dafür, dass ein Client die Verbindung "transportnah" in einem scheinbar zeitgesteuerten Intervall trennt? Der Client verbindet sich problemlos wieder, aber es verursacht extreme Unannehmlichkeiten, da dies so häufig vorkommt.
Ich habe verschiedene Einstellungen ausprobiert, wie das Ändern von pingInterval, pingTimeout und dem Port für Websockets (ich verwende jetzt Port 80). Aber egal was ich zu tun scheine, das Problem verschwindet nie.
Aktualisiert auf socket.io v2.0.3. und habe immer noch das Problem. Es scheint nur auf einem meiner PCs zu passieren. Ich habe auch die Windows-Firewall deaktiviert, aber das Problem tritt immer noch auf.
Wechsel zu ws (https://github.com/websockets/ws), was massive Umschreibungen mit sich brachte, aber ich verwende jetzt das native Websocket-Browserobjekt auf der Clientseite und alles funktioniert perfekt. Ich habe das Problem nicht mehr. So lange socket.io!
Das gleiche erleben. Ich möchte wirklich nicht umschreiben müssen. Hat jemand mit diesem Problem Erfolg?
Ich hatte dieses Problem wirklich satt.
Ich denke, Sie sollten die Version von "socket.io" mit "socket.io-client" überprüfen.
Wenn die Server-/Client-Version nicht übereinstimmt, war die Verbindung sehr instabil.
Ich empfehle, einfach CDN wie unten für den Client zu verwenden.
@ref: https://cdnjs.com/libraries/socket.io
I hope it helps.
Feudal Wars-Entwickler?? Es ist großartig.
Auch ich habe dieses Problem.
Der Benutzer wurde aufgrund von Transportschließung und Ping-Zeitüberschreitung zufällig getrennt.
Ich habe auch versucht, viele Optionen zu ändern (Ping-Intervall, Ping-Timeout, Übertragung ...), aber es funktioniert nicht.
Ich habe die Version von socket.io des Servers und des Clients überprüft
Viele Menschen leiden unter diesem Problem, aber ich kann keine Lösung finden.
Gibt es Neuigkeiten zu diesem Problem, da ich genau das gleiche Problem habe!
Ich habe das gleiche Problem auch, wenn ich k8ns bereitstelle, aber wenn ich lokal ausführe, funktioniert es einwandfrei.
ich leide auch darunter...
@talas9 @muhammadnasr @htamop die allgemeinen Fragen, um das Problem debuggen / reproduzieren zu können:
Vielen Dank!
Ich habe es mit 2.1.0 und 2.0.4 Client und Server probiert. Auf Chrom und Safari (neueste).
Wenn ich lokal ausführe, funktioniert es einwandfrei (kann über eine Stunde lang ohne Trennung verbunden werden), aber wenn ich K8ns hinter dem Ingress-Loadbalancer bereitstelle, tritt dieses Problem auf ...
Zu Ihrer Information wird die Verbindung jedes Mal genau nach 25 Sekunden geschlossen, siehe Screenshot
@talas9 @htamop @dnwldbs84 verwenden Sie einen Load Balancer?
@darrachequesne Welche(n) Load-Balancer empfehlen Sie, mit socket.io zu verwenden?
@muhammadnasr @darrachequesne
Ich habe den 2.1.0-Server und den 1.0.0-Client (Android) verwendet.
Ich muss die Verbindung 8 bis 9 Stunden lang stabil halten, aber sie wird unerwartet getrennt.
Ich habe beide Versionen auf 1.7.4 und 0.8.3 geändert? nach anderen Lösungspost. Ich werde morgen mal testen ob es gut funktioniert
Ich hatte keinen Load Balancer verwendet. Sowohl der Client als auch der Server verwendeten die Version 2.0.3 von Socket.io (ich kann mich nicht an alle Versionen erinnern, die ich verwendet habe). Ich weiß nicht, welcher Browser das Problem verursacht. Die meisten Benutzer haben jedoch Chrome verwendet. In meinem Fall war die Trennung zufällig, so dass sie sich nicht reproduzieren kann.
Und ich wechselte zu ws. Ich bin mir nicht sicher, ob das Problem gelöst ist.
@muhammadnasr @darrachequesne @dnwldbs84
Ich denke, in meinem Fall ist es gelöst.
Ich verwende 0.8.3 socket.io-client im Android-Vordergrunddienst (api 26) und die Version 1.3.5 im nodejs-Server.
Das Problem kann jedoch nicht an der Version liegen.
Ich habe pingInterval im Server auf 10 ms geändert und es scheint ordnungsgemäß zu funktionieren (Ping-Timeout und Transportabschluss sind nicht aufgetreten)
var io = require('socket.io')(http, {pingInterval: 10, pingTimeout: 4000 });
10 Millisekunden sind zu eng, dadurch wird das Netzwerk überlastet.
10 Millisekunden sind zu eng, dadurch wird das Netzwerk überfordert.
Richtig!
@muhammadnasr jeder Load-Balancer sollte funktionieren. Bitte sehen Sie sich die folgenden Beispiele an:
Sticky-Session ist jedoch erforderlich, wenn Sie Polling aktivieren (was die Standardeinstellung ist).
@darrachequesne Ich habe das gleiche Problem, nach 8 ~ 9 Stunden trennt sich die Steckdose mit dem Grund "Transport in der Nähe"
Ich benutze:
Chrome: 61.0.3163.100
Electron: 2.0.2
Socket.io: 2.1.1
Hatte das gleiche Problem, konnte es mit CDN aus diesem Kommentar https://github.com/socketio/socket.io/issues/3025#issuecomment -329024833 beheben und Timeout und Intervall wie folgt einstellen:
io.set('heartbeat timeout', 60000);
io.set('heartbeat interval', 25000);
Hey,
Wir haben das gleiche Problem mit socket.io, wenn es unter Kubernetes und NGINX Ingress Controller ausgeführt wird.
Wenn die nginx-Konfiguration neu geladen wird, wird der Prozess neu erstellt und die gesamte vorhandene Kommunikation wird gelöscht, was zu transport close
führte. Alle anderen Bereitstellungen, die den Ingress-Controller verwenden, können das erneute Laden der Konfiguration verursachen
Erstmal vielen Dank für dieses tolle Projekt.
Gleiches Thema hier, vielleicht bringe ich dir etwas Neues.
Ich habe einen ws-Server und einen ws-Client auf dem Knoten js.
Dieser ws-Client wird von einer Knoten-js-App verwendet, in der sich ein Dienst (Mikrodienst) befindet.
Andere ws-Clients von Webbrowsern (von Client-Apps) kommunizieren über den ws-Server mit diesem Knoten-js-Dienst.
Alles funktioniert wie erwartet.
Bei Stresstests jetzt (10 Clients fragen intensiv nach Daten), am Ende der Tests, wenn alle Jobs und Transaktionen abgeschlossen sind, wird die Verbindung des Dienstes mit Fehler "transport close" geschlossen. Dies geschieht nicht immer.
Dies ist die Konfiguration des Servers:
pingTimeout: 15000,
pingIntervall: 20000,
Es sieht so aus, als ob während der hohen Last einige Pings verloren gehen ...? oder ich weiß es nicht.
Ist das etwas, was ich erwarten sollte?
Auch mit der Standardkonfiguration pingTimeout: 2000 erhielt ich diesen Fehler mitten im Stresstest. Dies war ebenfalls völlig unerwartet, aber nehmen wir an, der Server war überlastet und konnte nicht innerhalb von 2 Sekunden (!) antworten und wir könnten diesen Fehler erhalten. Aber jetzt mit pingTimeout: 15000 passiert es fast 50% und erst nach dem Ende der Tests.
Hmho, ich glaube, die Microservices sollten mit dieser Art von Fehlern rechnen, selbst wenn sie auf demselben LAN laufen, aber die Frage ist, warum passiert das?
Ich habe versucht, ein kleines Setup zu erstellen, um dieses Problem zu reproduzieren, aber ich konnte es nicht schaffen.
Wie aktiviert man die Protokolle? das DEBUG=socket.io* funktioniert nicht. Obwohl die Variable gesetzt ist, bekomme ich keine Ausgabe.
Ich glaube fest daran, dass dies mit #2924 zusammenhängt.
Die Wiederverbindung auf einem Client wird durch einige Browser (Safari und Chrome) verursacht, die Timer für inaktive Tabs drosseln, um Batterie zu sparen.
Dies führt zu verzögerten Heartbeat-Meldungen vom Client und vom Server, die die Verbindung aufgrund von pingTimeout schließen.
Das Erhöhen von pingTimeout funktioniert bis zu einem gewissen Grad, aber ich erhalte immer noch Reconnects in einer Produktionsumgebung.
Ich habe das gleiche Problem auch, wenn ich k8ns bereitstelle, aber wenn ich lokal ausführe, funktioniert es einwandfrei.
@muhammadnasr wo können Sie das Bereitstellungsproblem auf K8s überwinden? Ich habe ähnliche Probleme.
@bheema01 Stellen Sie einfach sicher, dass Sie Stickysession auf Ihrem Proxy/Loadbalancer aktiviert haben und es sollte funktionieren
Habe den gleichen Fehler
Gleiches Problem .....Clients verbinden und trennen wiederholt die Verbindung, wenn sich der serverseitige Socket-Endpunkt hinter einem Load Balancer befindet. Auch nach der Konfiguration von Sticky Sessions besteht das Problem weiterhin. @muhammadnasr konnten Sie das Problem lösen.
Ich habe diesen Fehler gesehen, wenn der Thread häufig länger als 200ms blockiert wurde.
Wenn dies häufig vorkommt, ist dies schlecht für socket.io _und auch für Ihre App_.
Das socket.io hat ein Timeout, um den Heartbeat der Verbindung zu überprüfen.
Wenn dieses Timeout überschritten wird, wird die Verbindung beendet und wir erhalten diesen Fehler.
@varunSabnis Nach dem
@dennisat Ich habe versucht zu überprüfen, wie lange es dauerte, bis mein Kunde ein Pong-Paket erhielt. Jedes Mal waren es über 200ms, was sowohl mit Socket-Server in der Cloud als auch mit Socket-Server auf meinem localhost getestet wurde. Das lokale Setup trennt den Socket nicht (alles funktioniert einwandfrei), während der Socket im Cloud-Setup ständig eine Verbindung herstellt und trennt. Also ich glaube nicht, dass das das Problem ist.
@muhammadnasr okay, das ist großartig. Habe es tatsächlich aktiviert, aber immer noch einige Probleme.
@muhammadnasr @darrachequesne @dnwldbs84
Ich denke, in meinem Fall ist es gelöst.
Ich verwende 0.8.3 socket.io-client im Android-Vordergrunddienst (api 26) und die Version 1.3.5 im nodejs-Server.
Das Problem kann jedoch nicht an der Version liegen.
Ich habe pingInterval im Server auf 10 ms geändert und es scheint ordnungsgemäß zu funktionieren (Ping-Timeout und Transportabschluss sind nicht aufgetreten)
var io = require('socket.io')(http, {pingInterval: 10, pingTimeout: 4000 });
Es funktioniert magisch, danke!!!!!!!
Ich finde, dass ich jedes Ping-Intervall "transportnah" habe.
Ich hatte dieses Problem wirklich satt.
Ich denke, Sie sollten die Version von "socket.io" mit "socket.io-client" überprüfen.
Wenn die Server-/Client-Version nicht übereinstimmt, war die Verbindung sehr instabil.Ich empfehle, einfach CDN wie unten für den Client zu verwenden.
@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
Schließlich finde ich heraus, dass es an der nicht übereinstimmenden Version von Client und Server liegt.
Alles funktioniert jetzt gut, wenn ich Client und Server dazu bringe, dieselbe Version von socket.io zu teilen.
Ich denke, die Ping-Pong-Logik kann sich in verschiedenen Versionen von socket.io unterscheiden, und der Server hat das Ping-Ereignis von der Clientseite im Ping-Intervall nicht empfangen, was die Nachricht "Transport close" ausgibt.
Nach der Bereitstellung auf der Google Cloud Platform (GCP) trat das Problem der Socket.io-Verbindung alle 30 Sekunden auf. Es stellte sich heraus, dass es sich um ein Standard-HTTP-Timeout handelt, das vom Global Load Balancer verwendet wird. In der GCP-Dokumentation heißt es, dass Sie den Wert ändern sollten, wenn Sie Websockets verwenden. Anweisungen zum Ändern der Einstellung finden Sie hier:
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting
immer noch das gleiche Problem auf "socket.io": "2.2.0",
"socket.io-client": "2.2.0",
socket.io- client:socket schließen (ping timeout) +22s
Hier gilt das gleiche. Der lokale Server bekommt nie ein Problem. Bei der Bereitstellung hinter einem Load Balancer tritt jedoch ein zufälliges Ping-Timeout auf. Wahrscheinlich 1 von 50 Mal. Ich habe versucht, die CDN-Version zu verwenden und die Sticky-Sitzung hinzuzufügen. Das Problem besteht weiterhin.
Außer einer benutzerdefinierten Wiederverbindungslogik hat bei mir nichts funktioniert. Wenn der Client ein Socket-Open-Ereignis mit einer anderen ID als der vorherigen erhält, senden Sie dem Server ein Reconnect-Ereignis mit der alten und neuen ID. Aktualisieren Sie dann auf dem Server einfach die Socket-ID des Spielers und senden Sie den Spielstatus erneut.
@tmusaev könnten Sie diese benutzerdefinierte Wiederverbindungslogik für den Client posten?
Ich habe das gleiche Problem: "Transport nah"
habe das gleiche problem. endlich löse ich es. Nginx ist mein Proxy-Server, aber proxy_read_timeout
der Konfiguration ist 60s. Dies zeigt an, dass nginx die Verbindung trennen wird, wenn der Client oder Server in den 60s keine Nachricht ausgibt, sodass wir diese transport close
errorMsg erhalten.
die Lösung:
proxy_read_timeout
auf 600s oder mehrsetInterval
, um eine Nachricht an das Front-End zu senden"react": "16.8.3",
"react-native": "^0.59.9",
"socket.io": "^2.2.0"
Ich habe diese Bibliothek zum Chatten und zum Abrufen einiger Ereignisse verwendet. Es funktioniert gut in iOS, verursacht aber ein Problem in Android. Es hat die Socket-Verbindung jederzeit verloren und erneut verbunden. Es zeigt ständig das gleiche Verhalten. und geben Sie auch diesen Transportabschluss- oder Ping-Timeout-Fehler an
"react": "16.8.3", "react-native": "^0.59.9", "socket.io": "^2.2.0"
Ich habe diese Bibliothek zum Chatten und zum Abrufen einiger Ereignisse verwendet. Es funktioniert gut in iOS, verursacht aber ein Problem in Android. Es hat die Socket-Verbindung jederzeit verloren und erneut verbunden. Es zeigt ständig das gleiche Verhalten. und geben Sie auch diesen Transportabschluss- oder Ping-Timeout-Fehler an
+1
In unserem Fall wird das Problem durch den CDN-Proxy verursacht. Ich habe dieses Problem gelöst, indem ich socket.io mit der ursprünglichen Site verbunden habe, die kein CDN-Proxy war.
Wir haben dieses Problem gelöst, indem wir den nginx-Ingress-Controller aktualisiert haben!
Nachdem ich mehrere Kommentare zu verschiedenen Threads gelesen habe, habe ich so ziemlich alle Vorschläge ausprobiert, um dieses Problem mit der Transportschließung zu mildern. Trotz der Versionen, die ich auf dem Client/Server verwende (derzeit 2.0.3), tritt dieses Verhalten auf, wenn ich meine Microservices mit Kubernetes bereitstelle.
Derzeit hat der Server die folgende Konfiguration:
Wie andere bereits erwähnt haben, wird die Verbindung nicht unterbrochen, wenn ich die Anwendung lokal ausführe. Ich habe in einem anderen Thread gelesen, dass Version 3 für socket.io den Ping / Pong ändert, damit es für den Server erledigt ist, und dies könnte helfen, dies zu beheben. Hat jemand Neuigkeiten oder Updates zu diesem Problem oder ein mögliches Datum für diese neue Version?
Ich habe diesen Fehler gesehen, wenn der Thread häufig länger als 200ms blockiert wurde.
Wenn dies häufig vorkommt, ist dies schlecht für socket.io _und auch für Ihre App_.
Das socket.io hat ein Timeout, um den Heartbeat der Verbindung zu überprüfen.
Wenn dieses Timeout überschritten wird, wird die Verbindung beendet und wir erhalten diesen Fehler.
Wenn Sie Socket.IO verwenden, um große Datenmengen zu senden, stellen Sie sicher, dass dies so erfolgt, dass der Thread nicht blockiert wird. Ich bin heute mit dem Socket-Client auf React Native darauf gestoßen und verwende ihn, um Dateien an den Server zu senden. Aufgrund der Art und Weise, wie wir das Senden von Dateien über den Socket geschrieben haben, was im Wesentlichen alles in einem und nicht sequenziell ist, wird der JS-Thread blockiert und kann keinen Pong zurück an den Server senden, ihn trennen, was uns dies gibt Error.
Ich habe das gleiche Problem mit meiner App, ich glaube nicht, dass es sich um ein Ping-Pong-Problem handelt. Ich bezweifle, dass es sich um ein serverseitiges Problem handeln sollte, das den Transport von Sockets geschlossen hat.
Dasselbe Problem. In einem Angular-Browser.
Diese Konfiguration hat die Anzahl der Wiederverbindungen erheblich reduziert:
Ich habe forceJSONP wegen Cors verwendet
Nach meiner Analyse habe ich das folgende Problem gefunden
AUSGABE:
Sockets funktionieren ohne lokale Unterbrechungen einwandfrei, aber wenn sie in Umgebungen bereitgestellt werden, werden die Sockets mit "Transport Close" als Trennungsgrund getrennt.
Ich habe dieses Problem nur beim Ausführen der Knotenanwendung mit einem Upstart-Dienst oder Systemmd-Dienst gesehen. Wenn wir die Anwendung wie node app.js ausführen, sehe ich dieses Problem NICHT.
EINFACHE BEHEBUNG/BEHEBUNG:
Auf der Client-Seite, beim Trennen von Sockets, Socket ausgeben, um einen Benutzer hinzuzufügen (Winkel 11)
self.socket.on('disconnect', (reason) => {
if(currentUser){
self.socket.emit('add user', currentUser);
}
})
Mit dem obigen Szenario sind alle Benutzer immer verbunden und online, werden beim Abmelden getrennt
Hilfreichster Kommentar
Nach der Bereitstellung auf der Google Cloud Platform (GCP) trat das Problem der Socket.io-Verbindung alle 30 Sekunden auf. Es stellte sich heraus, dass es sich um ein Standard-HTTP-Timeout handelt, das vom Global Load Balancer verwendet wird. In der GCP-Dokumentation heißt es, dass Sie den Wert ändern sollten, wenn Sie Websockets verwenden. Anweisungen zum Ändern der Einstellung finden Sie hier:
https://cloud.google.com/load-balancing/docs/backend-service#timeout -setting