So verbinden Sie sich nach einer engen Verbindung wieder mit dem Websocket [duplicate]

Lesezeit: 6 Minuten

Benutzer-Avatar
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.

    – 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

Benutzer-Avatar
SzG

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

Benutzer-Avatar
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


Benutzer-Avatar
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.

    –Daniel F

    22. März 2017 um 15:57 Uhr


Benutzer-Avatar
xmasiv

Einwandfreie Umsetzung:

var socket;

const socketMessageListener = (event) => {
  console.log(event.data);
};

const socketOpenListener = (event) => {
  console.log('Connected');
  socket.send('hello');
};

const socketCloseListener = (event) => {
  if (socket) {
    console.error('Disconnected.');
  }
  socket = new WebSocket('ws://localhost:8080');
  socket.addEventListener('open', socketOpenListener);
  socket.addEventListener('message', socketMessageListener);
  socket.addEventListener('close', socketCloseListener);
};

socketCloseListener();

Um es zu testen:

setTimeout(()=>{
  socket.close();
},5000);

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.

Nochmals editieren: Auschecken back aus primus: https://www.npmjs.com/package/backes ist eine flexible sexy Implementierung.

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.

1281240cookie-checkSo verbinden Sie sich nach einer engen Verbindung wieder mit dem Websocket [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy