WebSocket Connection timeout
Bin ich versucht zu implementieren failsafe-websocket-wrapper. Und das problem, das ich habe, ist der Umgang mit timeout-Fehler. Die Logik sollte sein: wenn der socket ist nicht geöffnet während $timeoutInMiliseconds - es muss geschlossen und wieder geöffnet $N-mal.
Ich bin etwas zu schreiben wie dieses.
var maxReconects = 0;
var ws = new WebSocket(url);
var onCloseHandler = function() {
if ( maxReconects < N ) {
maxReconects++;
//construct new Websocket
....
}
};
ws.onclose = onCloseHandler;
var timeout = setTimeout(function() {
console.log("Socket connection timeout",ws.readyState);
timedOut = true;
ws.close(); <--- ws.readyState is 0 here
timedOut = false;
},timeoutInMiliseconds);
Aber das problem ist der Umgang mit timeout websockets richtige Weg ist - wenn ich versuche zu schließen nonconnected socket erhalte ich die Warnung in chrome :
"WebSocket-Verbindung zu 'ws://127.0.0.1:9010/timeout' ist fehlgeschlagen: WebSocket ist geschlossen, bevor die Verbindung hergestellt wird."
Und ich habe keine Ahnung, wie es zu vermeiden - ws-Schnittstelle hat kein Abbruch-Funktion .
Die andere Vorgehensweise habe ich versucht, ist nicht zu schließen socket-timeout auf, wenn es nonconnected, sondern nur Kennzeichnen, dass Sie nicht mehr verwendet werden, und schließen Sie es, wenn Sie es erhalten readyState mehr als eine - aber es können mögliche Undichtigkeiten und zu kompliziert für diese einfache Aufgabe.
InformationsquelleAutor Oleg | 2015-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
timeout
variable zugewiesen wird, diesetTimeout(...
- Funktion, die aufgerufen wird lexikalisch. Durch die Zeit, die Ihr code bekommtvar onCloseHander = ...
Ihretimeout
Funktion bereits aufgerufen.Eine Lösung dies ist, um eine
makeTimeout
Funktion:var timeoutId = makeTimeout(100)
ruft diesetTimeout
- Funktion und stellentimeoutId
als der Wert der timeout-ID. Wenn Sie stornieren müssen dieses Zeitlimit, das getan werden kann, durch aufrufenwindow.clearTimeout(timeoutId)
.InformationsquelleAutor amarpatel
Ich geschrieben habe folgenden code für öffnen einer websocket-failsafe mit timeout und Wiederholungen, siehe Kommentare im code weitere details.
Nutzung - öffnen einer websocket mit timeout 5000ms und 10 Wiederholungen (maximal):
Methode
initWebsocket()
irgendwo in einer Bibliothek definiert oder ähnliches:eine bessere Lösung wäre die Kapselung der Funktionalität in einer eigenen Klasse
FailsafeWebsocket
oder was auch immer. Allerdings ist diese Lösung ausreichend ist, in meinem Projekt - vielleicht hilft es jemand anderem zu.InformationsquelleAutor klues