So verbinden Sie sich nach einer engen Verbindung wieder mit dem Websocket [duplicate]
Lesezeit: 6 Minuten
ket
Ich baue meine Websocket-Verbindung mit diesem Code auf (z. B.):
var socket = new WebSocket("ws://94.12.176.177:8080");
Und ich schließe die Verbindung mit diesem:
socket.close();
Aber wie stelle ich die Verbindung wieder her?
Ich habe etwas recherchiert und mehrere Methoden ausprobiert. Diese Frage konnte mir nicht helfen: Socket.io beim Trennen erneut verbinden? Es ist das einzige Ergebnis, das dem, was ich suche, nahe kommt.
Der Grund, warum ich dies tun möchte, besteht darin, Benutzern zu ermöglichen, das Senden von Daten an das Web vorübergehend zu stoppen und nach einer bestimmten Zeit erneut zu senden. Ohne erneute Verbindung muss der Benutzer die Seite aktualisieren, um erneut zu senden. Dies kann dazu führen, dass einige Daten verloren gehen. Vielen Dank.
Erstellen Sie einfach erneut ein neues WebSocket. Der Grund, warum eine Wiederverbindung nicht existiert, ist, dass es wahrscheinlich so wäre, als würde man eine neue erstellen.
– AHungerArtist
10. Dezember 2012 um 8:28 Uhr
Mögliches Duplikat von Wiederverbindung des Clients, wenn der Server in WebSocket neu gestartet wird.
Wenn der Server die Verbindung schließt, der Client nicht versuchen Sie, sich wieder zu verbinden. Mit einigen JS-Frameworks vielleicht, aber die Frage war zum Zeitpunkt dieser Antwort als einfaches Vanilla-JS gekennzeichnet.
Ich bin etwas frustriert, weil die akzeptierte, positiv bewertete Antwort eindeutig falsch ist und es mich einige Zeit gekostet hat, die richtige Lösung zu finden.
Welches ist hier: Wiederverbindung des Clients, wenn der Server in WebSocket neu gestartet wird
Sorry für deine Frustration. Das OP verlinkt auf a socket.io Frage, und das muss der Rahmen gewesen sein, den er benutzte. Die Frage sollte markiert werden socket.io.
– Jivings
1. Juli 2016 um 9:58 Uhr
Danke für den Link; es hat funktioniert. Die akzeptierte Antwort war nicht sinnvoll, da ich an einem Websocket ohne Framework arbeite.
– Tschad
14. September 2016 um 1:22 Uhr
Die Antwort, auf die Sie zeigen, macht im Wesentlichen dasselbe, was @Jivings vorschlägt. Außer dieser wird nicht erwähnt socket.close Instanzmethode.
– aegiert
1. November 2016 um 21:44 Uhr
Pol
Ich habe auf dieser Seite eine großartige Lösung gefunden: sam-low.com
Nachdem die ursprüngliche Verbindung geschlossen wurde, müssen Sie ein neues WebSocket-Objekt mit neuen Ereignis-Listenern erstellen
function startWebsocket() {
var ws = new WebSocket('ws://localhost:8080')
ws.onmessage = function(e){
console.log('websocket message event:', e)
}
ws.onclose = function(){
// connection closed, discard old websocket and create a new one in 5s
ws = null
setTimeout(startWebsocket, 5000)
}
}
startWebsocket();
Beachten Sie, dass das neue WebSocket-Objekt bei einem erneuten Verbindungsproblem weiterhin ein weiteres Schließereignis empfängt, was bedeutet, dass onclose() wird ausgeführt, auch wenn es nie technisch geöffnet wurde. Aus diesem Grund ist die Verzögerung von fünf Sekunden sinnvoll – ohne sie könnten Sie feststellen, dass Sie Tausende von Websocket-Verbindungen mit einer Geschwindigkeit erstellen und zerstören, die wahrscheinlich etwas kaputt machen würde.
Entschuldigung, ist das optimiert?
– Ali Alizadeh
4. November 2021 um 12:39 Uhr
Jivings
HINWEIS: Die Frage ist markiert socket.io Diese Antwort bezieht sich also speziell auf socket.io.
Wie viele Leute darauf hingewiesen haben, gilt diese Antwort nicht für Vanilla-Websockets, die unter keinen Umständen versuchen, die Verbindung wiederherzustellen.
Websockets versuchen nicht automatisch, die Verbindung wiederherzustellen. Sie müssen den Socket neu erstellen, um eine neue Verbindung zu erhalten. Das einzige Problem dabei ist, dass Sie Ihre Handler neu anhängen müssen.
Aber wirklich, Websockets sind so konzipiert, dass sie offen bleiben.
Eine bessere Methode wäre, die zu haben Server beendet die Verbindung. Auf diese Weise wird der Websocket eine auslösen onclose Ereignis, versucht aber weiterhin, die Verbindung herzustellen. Wenn der Server wieder zuhört, wird die Verbindung automatisch wiederhergestellt.
Das Verhalten, bei dem der Client-Socket versucht, die Verbindung wiederherzustellen – ich denke, das ist eine Socketio-Sache? (keine grundlegende Websockets-Sache?)
– UpTheCreek
14. Juni 2013 um 12:34 Uhr
@UpTheCreek Ja, ich denke schon. Normale Websockets versuchen nicht, die Verbindung wiederherzustellen, wenn Sie anrufen close()
– Jivings
16. Juni 2013 um 19:02 Uhr
Ich habe eine reine Open-Source-AS3-Implementierung von WebSockets und TLS verwendet, aber ich habe entschieden, dass die Implementierung des Browsers aktueller gehalten wird, also habe ich einen JS-WebSocket-Manager erstellt, den meine AS3-WebSocket-Klasse aufruft. Der Manager erstellt Instanzen mit eindeutigen IDs und Rückrufen, die das Ereignis und die Socket-ID an statische Methoden in Flash weiterleiten, die dann die entsprechende AS3-Instanz suchen und Ereignisse darauf verteilen. Dadurch kann ich “reconnect ();” ohne Ereignishandler neu anfügen zu müssen, da der AS3-WebSocket nur einen neuen JS-WebSocket und eine neue ID unter der Haube anfordert.
– Triynko
9. August 2013 um 5:17 Uhr
Wenn der Server die Verbindung schließt, versucht der Client NICHT, die Verbindung wiederherzustellen. Mit einigen JS-Frameworks vielleicht, aber die Frage ist als einfaches Vanilla-JS gekennzeichnet.
– SzG
30. Juni 2016 um 5:37 Uhr
Und es gibt einen guten Grund dafür, dass sich Plain Vanilla Js nicht automatisch wieder verbindet. Wer will schon seinen Proxy hämmern lassen, während der Websocket-Server ausgefallen ist? Nehmen Sie sich Zeit und implementieren Sie eine Wiederverbindungsstrategie, die Ihren Anforderungen entspricht.
Bearbeiten: Beachten Sie die Exponential Backoff-Implementierung (im verlinkten Thread durch den obersten Kommentar: https://stackoverflow.com/a/37038217/8805423), nicht im obigen Code, ABER SEHR SEHR WICHTIG.
function wsConnection(url){
var ws = new WebSocket(url);
var s = (l)=>console.log(l);
ws.onopen = m=>s(" CONNECTED")
ws.onmessage = m=>s(" RECEIVED: "+JSON.parse(m.data))
ws.onerror = e=>s(" ERROR")
ws.onclose = e=>{
s(" CONNECTION CLOSED");
setTimeout((function() {
var ws2 = new WebSocket(ws.url);
ws2.onopen=ws.onopen;
ws2.onmessage = ws.onmessage;
ws2.onclose = ws.onclose;
ws2.onerror = ws.onerror;
ws = ws2
}
).bind(this), 5000)
}
var f = m=>ws.send(JSON.stringify(m)) || "Sent: "+m;
f.ping = ()=>ws.send(JSON.stringify("ping"));
f.close = ()=>ws.close();
return f
}
c=new wsConnection('wss://echo.websocket.org');
setTimeout(()=>c("Hello world...orld...orld..orld...d"),5000);
setTimeout(()=>c.close(),10000);
setTimeout(()=>c("I am still alive!"),20000);
<pre>
This code will create a websocket which will
reconnect automatically after 5 seconds from disconnection.
An automatic disconnection is simulated after 10 seconds.
12812400cookie-checkSo verbinden Sie sich nach einer engen Verbindung wieder mit dem Websocket [duplicate]yes
Erstellen Sie einfach erneut ein neues WebSocket. Der Grund, warum eine Wiederverbindung nicht existiert, ist, dass es wahrscheinlich so wäre, als würde man eine neue erstellen.
– AHungerArtist
10. Dezember 2012 um 8:28 Uhr
Mögliches Duplikat von Wiederverbindung des Clients, wenn der Server in WebSocket neu gestartet wird.
– Peter Mortensen
28. Januar 2017 um 14:35 Uhr
Hier ist eine der möglichen Lösungen: github.com/gdi2290/angular-websocket/issues/100
– Tomasz Waszczyk
6. März 2018 um 13:00 Uhr