Ich möchte den Grund für das Schließen von Websockets erhalten, damit ich dem Benutzer die richtige Nachricht anzeigen kann.
ich habe
sok.onerror=function (evt)
{//since there is an error, sockets will close so...
sok.onclose=function(e){
console.log("WebSocket Error: " , e);}
Der Code ist immer 1006 und der Grund ist immer "". Aber ich möchte verschiedene abschließende Gründe auseinanderhalten.
Zum Beispiel gibt die Befehlszeile einen Fehlergrund an: "Sie können das nicht löschen, weil die Datenbank dies nicht zulässt". Aber auf der Chrome-Konsole ist der Grund immer noch "".
Gibt es eine andere Möglichkeit, verschiedene Abschlussgründe voneinander zu unterscheiden?
javascript
websocket
Slevin
quelle
quelle
Antworten:
Close Code
1006
ist ein spezieller Code, der bedeutet, dass die Verbindung von der Browser-Implementierung abnormal (lokal) geschlossen wurde.Wenn Ihr Browser-Client Abschlusscode meldet
1006
, sollten Sie sich daswebsocket.onerror(evt)
Ereignis nach Details ansehen.Chrome meldet
1006
der Javascript-Seite jedoch selten Gründe für einen engen Code . Dies ist wahrscheinlich auf Client-Sicherheitsregeln in der WebSocket-Spezifikation zurückzuführen, um den Missbrauch von WebSocket zu verhindern. (z. B. zum Scannen nach offenen Ports auf einem Zielserver oder zum Generieren vieler Verbindungen für einen Denial-of-Service-Angriff).Beachten Sie, dass Chrome häufig einen Abschlusscode meldet,
1006
wenn während des HTTP-Upgrades auf Websocket ein Fehler auftritt (dies ist der Schritt, bevor ein WebSocket technisch "verbunden" wird). Aus Gründen wie einer schlechten Authentifizierung oder Autorisierung oder einer schlechten Protokollverwendung (z. B. dem Anfordern eines Unterprotokolls, aber der Server selbst unterstützt dasselbe Unterprotokoll nicht) oder sogar dem Versuch, mit einem Serverstandort zu sprechen, der kein WebSocket ist ( wie der Versuch, eine Verbindung zu herzustellenws://images.google.com/
)Wenn Sie einen geschlossenen Code sehen
1006
, haben Sie grundsätzlich einen Fehler auf sehr niedriger Ebene mit WebSocket selbst (ähnlich wie "Datei kann nicht geöffnet werden" oder "Socket-Fehler"), der nicht wirklich für den Benutzer gedacht ist, da er auf ein Problem auf niedriger Ebene hinweist mit Ihrem Code und Ihrer Implementierung. Beheben Sie Ihre Probleme auf niedriger Ebene, und wenn Sie verbunden sind, können Sie vernünftigere Fehlercodes einfügen. Sie können dies in Bezug auf Umfang oder Schweregrad in Ihrem Projekt erreichen. Beispiel: Info- und Warnstufe sind Teil des spezifischen Protokolls Ihres Projekts und führen nicht dazu, dass die Verbindung beendet wird. Bei schwerwiegenden oder schwerwiegenden Meldungen wird auch das Protokoll Ihres Projekts verwendet, um so viele Details wie gewünscht zu übermitteln, und anschließend wird die Verbindung mithilfe der eingeschränkten Funktionen des WebSocket Close Flow geschlossen.Beachten Sie, dass WebSocket-Schließcodes sehr streng definiert sind und die Abschlussgrundphrase / -nachricht nicht länger als 123 Zeichen sein darf (dies ist eine absichtliche WebSocket-Einschränkung).
Es ist jedoch nicht alles verloren, wenn Sie diese Informationen nur aus Debugging-Gründen benötigen. Die Details des Abschlusses und die zugrunde liegenden Gründe werden in der Javascript-Konsole von Chrome häufig mit ziemlich vielen Details angegeben.
quelle
sok.onerror=function (evt) {console.log(evt);}
die Details benutze, sind sie nicht so sehr. Nicht einmal einreason
oder so. Also überhaupt keine Optionen? Ich zeige nur dem Benutzer,something is wrong, or not connencted?
nicht so benutzerfreundlich, es wäre schön, wenn der Benutzer sehen könnte "Sie können nicht löschen, wegen Datenbankbeschränkungen". Irgendwelche Optionen? Dankesok.onclose
stattdessen verwenden, welche Auslöserclose event
es hatreason
undcode
darinsok.onclose
wird für viele Pfade funktionieren, aber nicht für alle Pfade. Besonders schlechtes Protokoll, schlechte Handshake-Fehler (wie einige Bedingungen, die zu einem engen Code führen können1006
). Wird sich dies in Zukunft ändern? Wahrscheinlich. Aber als diese Antwort geschrieben wurde, war es wahr.reason
bei seiner Verwendung nicht zurückgekehrt ist.onerror
Ich habe darauf hingewiesen, dass diese Eigenschaftencode
&reason
spezifisch fürclose
Ereignis nichterror
Ereignis sind. Also wäre es besser für ihn ,onclose
stattdessen etwas zu verwenden. Vermisse ich etwas?1006
der eine besondere Bedeutung hat, und eine spezielle Behandlung in der Websocket-Spezifikation und der Javascript-Websocket-API. Der Grund, warum Zeichenfolge / Nachricht unter bestimmten1006
Bedingungen spezifisch und absichtlich nirgendwo in der API verfügbar gemacht wird. (wie die Antwort zeigte). Dies ist kein Fehler in der API, sondern lediglich die verschiedenen Spezifikationen und ihre Bedenken hinsichtlich des Missbrauchs von Websockets für Nicht-Websocket-Zwecke.In meinem und möglicherweise @BIOHAZARD Fall war es
nginx proxy timeout
. Standardmäßig ist es60
sec ohne Aktivität im SocketIch habe es auf 24 Stunden geändert
nginx
und das Problem wurde behobenquelle
Dies scheint der Fall zu sein, wenn Chrome nicht dem WebSocket-Standard entspricht. Wenn der Server das Schließen initiiert und das Schließen eines Frames an einen Client sendet, betrachtet Chrome dies als Fehler und meldet ihn mit dem Code 1006 und ohne Grundmeldung an die JS-Seite. In meinen Tests reagiert Chrome niemals auf vom Server initiierte Close Frames (Close Code 1000), was darauf hindeutet, dass Code 1006 wahrscheinlich bedeutet, dass Chrome seinen eigenen internen Fehler meldet.
PS Firefox v57.00 behandelt diesen Fall ordnungsgemäß und übermittelt die Ursachenmeldung des Servers erfolgreich an die JS-Seite.
quelle
Dachte, dies könnte für andere nützlich sein. Regex zu kennen ist nützlich, Kinder. In der Schule bleiben.
Bearbeiten: Verwandelte es in eine praktische Dandy-Funktion!
Verwendung:
Quelle (mit geringfügigen Änderungen für die Knappheit): https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes
quelle
Ich habe den Fehler bei der Verwendung von Chrome als Client und Golang Gorilla Websocket als Server unter Nginx Proxy
Und jede x Sekunde wird nur eine "Ping" -Nachricht vom Server an den Client gesendet. Das Problem wurde behoben
quelle
Dies kann sein, dass Ihre Websocket-URL, die Sie im Gerät verwenden, nicht identisch ist (Sie treffen eine andere Websocket-URL von Android / Iphonedevice).
quelle