Socket.io-client: Verbinden -> Trennen -> Verbinden funktioniert nicht

Erstellt am 23. Juli 2011  ·  33Kommentare  ·  Quelle: socketio/socket.io-client

Der folgende Code funktioniert bei mir nicht:
socket = io.connect ('http://host.com:8081'); socket.disconnect (); socket = io.connect ('http://host.com:8081');

Dies ist eine Problemumgehung, die ich gefunden habe:
socket = io.connect ('http://host.com:8081'); socket.disconnect (); lösche io.sockets [' http://host.com : 8081']; io.j = []; Socket = io.connect ('http://host.com:8081');

Unable to reproduce bug

Hilfreichster Kommentar

Verwenden Sie dieses: io.connect(null,{'force new connection':true});

Alle 33 Kommentare

Das gleiche Problem hier - konnte nicht wie beschrieben eine Verbindung herstellen, trennen oder wieder herstellen.

Ich habe jedoch festgestellt, dass das Folgende funktioniert. Seltsamerweise werden Sie sofort getrennt, wenn Sie das setTimeout weglassen und die Verbindung sofort (oder nach einer zu kurzen Zeitüberschreitung) wieder herstellen.

var ns = io.connect(
        '/',
        { reconnect: false }
    ),
    numDisconnects = 2;

ns.on('connect', function () {

    console.log('Connected');

    if (numDisconnects > 0) {
        console.log('Disconnecting');
        ns.socket.disconnect();

        setTimeout(function () {
            console.log('Reconnecting');
            ns.socket.connect();
        }, 5000);
    }
    numDisconnects--;


});

ns.on('disconnect', function () {
    console.log('Disconnected');
});

Socket = io.connect (Host);
socket.disconnect ();
socket.socket.reconnect (); || socket.socket.connect (Host);
funktioniert, aber da die Verbindung wiederhergestellt oder die zweite Verbindung getrennt wird, wird alle paar Sekunden eine Verbindung hergestellt

Ich hatte das gleiche Problem, sodass ich meinen Knoten-Knockout-Eintrag aufgrund dieses Fehlers nicht rechtzeitig beenden konnte :(
Bitte beheben Sie es vor jedem anderen Herzschmerz!

Keine der oben genannten Problemumgehungen hat bei mir funktioniert. Leute, das ist ein ernsthafter Showstopper. Warum das Tag "Reproduzierbar nicht"? Meine Testumgebung. ist das neueste Chrome unter OS X 10.6.

Ich sehe das Gleiche. Auch das zweite Aufrufen von io.connect() schlägt fehlerfrei fehl. Hat jemand eine Problemumgehung gefunden?

Verwenden Sie dieses: io.connect(null,{'force new connection':true});

Wie bequem und hässlich. Was ist mit dem Entfernen von io.sockets[uuri] = socket; aus io.js:196 ? Was ist der Sinn dieser Pointe?

Leider das gleiche Problem hier. Sie können die Verbindung nach dem Trennen nicht wieder herstellen.

Einzige Sache, die bei mir nach dem Trennen funktioniert hat:
io.j = [];
io.sockets = [];

Bearbeiten: Es ist nicht nur ein Problem der clientseitigen Trennung (). Beim Trennen der Verbindung werden keine Datenstrukturen bereinigt. Sie können sehen, dass SocketNamespace. $ Events immer noch alle Rückrufe für geschlossene Verbindungen usw. enthält.

@ MrJoes Verwenden Sie io.connect(null,{'force new connection':true});

In Ordnung, ist dies wirklich die endgültige API für die erneute Verbindung? Recht merkwürdig.

@skrat Ich stimme dir zu. Es sollte eine io.reconnect API geben.

Ich denke nicht, io.connect dann io.disconnect dann io.connect sollte wie erwartet funktionieren.

@milani : und Speicherverlust aufgrund verwaister Sockets, Ereignishandler usw. in io.sockets []?

Keine sehr gute Idee, um ehrlich zu sein.

@ MrJoes Sind Sie sicher über Speicherverlust? @ 3rd-Eden von io.socket hat mir gesagt, dass ich diese API verwenden soll.

Egal, es wird kein Socket zu io.sockets [] hinzugefügt, wenn Sie "Neue Verbindung erzwingen" übergeben.

Es ist jedoch etwas hässlich, insbesondere bei Endpunkten, da Sie das Multiplexen verlieren. Für das Multiplexen ist der Socket in io.sockets erforderlich.

@ Gorokhov Vorschlag, Reconnect über den Socket-Prototyp zu verwenden, hat für mich gut funktioniert:
socket.socket.reconnect ()
Vielen Dank

Gleiches Problem hier - socket.reconnect () funktioniert bei mir nicht, ich werde ein paar andere Problemumgehungen ausprobieren. Dies ist jedoch enttäuschend, es ist eine ziemlich grundlegende Funktionalität, um ein Update einzubrechen. Ich bin mir sicher, dass viele Anwendungen aus diesem Grund nicht einfach aktualisiert werden können.

Wenn Entwickler Hilfe bei der Reproduktion des Problems benötigen, helfe ich gerne weiter. Ich bin überrascht, dass bei diesem Fehler das Tag "Nicht reproduzierbar" angezeigt wird.

Aufgrund dieser Pull-Anfrage scheint es bald ein großes Update zu geben: https://github.com/LearnBoost/socket.io-client/pull/343
@cacois Versuchen Sie, socket.socket.reconnect () anstelle von socket.reconnect () zu verwenden.

ah, tolle Neuigkeiten :-)

@ wackfordjf3 Hey danke, guter Anruf. Funktioniert jetzt. :) :)

Immer noch Probleme mit der Wiederverbindung.
Beim zweiten erneuten Verbinden werden mehrere Wiederverbindungsereignisse auf dem Server ausgelöst. (und dies multipliziert sich mit jeder nachfolgenden Wiederverbindung). Ich feuere erneut Verbindungen in einem Namespace an.

socket = io.connect (url {'reconnect': false}); socket.disconnect; // 1. Verbindung trennen
socket.socket.reconnect (); socket.disconnect (); // 2. Verbindung trennen
socket.socket.reconnect (); // 2. Verbindung wieder herstellen

Bin an: Steckdose. [email protected]

Mehr dazu :
Hässlicher Weg funktioniert gut:
lösche io.sockets [url]; io.j = [];
Socket = io.connect (URL);

Stellen Sie sich dem gleichen Gesicht, das die Leute hier bereits haben. sogar seltsam im Namespace-Szenario. Löschen Sie die Lösung für den Namespace:

var base = ' http: // localhost : 3000'
, channel = '/ chat'
, url = base + channel;

var socket = io.connect (url);

// socket.disconnect () aufrufen wird nicht getrennt, also:
io.sockets [base] .disconnect ();

// Syntax wieder verbinden.
lösche io.sockets [base]; io.j = [];
Socket = io.connect (URL);

Hinweis: socket.io Version - 0.9.0, Plattform: Windows 7 Home Premium

verbrachte einen Nachmittag damit, mit Unit-Tests zu ringen, bei denen das Timing abgelaufen war, weil ich nach dem Trennen der Verbindung keine Verbindung herstellen konnte. {'Neue Verbindung erzwingen': true} hat das Problem behoben. danke @milani

Gleiches Problem hier mit Cucumber.js. Da ich Objekte erstellen und zerstören musste, hatte ich die gleiche Verbindung, Trennung, Verbindung fehlgeschlagen. Danke @milani und @rawberg

Für mich geht das! Danke @mrjoes.

Danke @milani

Die Einstellung "Neue Verbindung erzwingen" heißt jetzt in Version 1.0 "forceNew" für diejenigen, die möglicherweise erneut auf dieses Problem gestoßen sind.

Ich habe mich verpflichtet, BC damit hinzuzufügen, so dass bald niemand mehr dieses Problem haben sollte!

es hat funktioniert 4 mich, socket = io.connect (socketUrl, {'forceNew': true});

forceNew deaktiviert das gesamte Namespace-Multiplexsystem. Ist das wirklich die Lösung?

Ich benutze:
Socket = io.connect ()
...
// DIES
socket.io.reconnect ()
..

Client.prototype.connect = function() {
    if (!this.connection) {
        this.connection = this.socket.connect(config.host + ':' + config.port);
    }
    else {
        if (!this.connection.connected) {
            this.connection.connect();
        }
    }
};

io.connect (null, {'neue Verbindung erzwingen': true});

das löst mein problem, danke herr. Milami

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen