Socket.io: fehlgeschlagen: Verbindung geschlossen, bevor eine Handshake-Antwort empfangen wurde

Erstellt am 9. März 2015  ·  21Kommentare  ·  Quelle: socketio/socket.io

Hallo

Ich verwende socket.io im Projektaufbau auf MEAN.IO (https://github.com/linnovate/mean).
Ich habe die Bibliothek erfolgreich integriert, auf meiner lokalen funktioniert alles ohne Fehler in der Konsole.

aber beim Bereitstellen des gleichen Codes auf dem Server zeigt es mir einen Fehler als

WebSocket-Verbindung zu „ws://ip.ip.ip.ip:3000/socket.io/?EIO=3&transport=websocket&sid=OpeM3YIJqVuTnt-dAAAY“ fehlgeschlagen: Verbindung geschlossen, bevor eine Handshake-Antwort empfangen wurde

Ich hatte dem Socket vorerst Optionen gegeben, um die Verbindung wiederherzustellen als: -

var socket = io.connect(baseUrl, {
'Wiederverbindung': wahr,
'reconnectionDelay': 1000,
'reconnectionDelayMax': 5000,
'forceNew': wahr
});

aber trotzdem bleibt die Steckdose manchmal inaktiv.

Handshakes

Hilfreichster Kommentar

@nkzawa Bei Verwendung von socket.io-redis(https://github.com/automattic/socket.io-redis) wird gelegentlich die folgende Fehlermeldung angezeigt:

WebSocket connection to 'ws://localhost:8501/socket.io/?EIO=3&transport=websocket&sid=WPOeefk2cs-DsfLFAAAE' failed: Connection closed before receiving a handshake response

Sobald dieser Fehler auftrat, gab eine HTTP-Anforderung 400 zurück. Die Fehler-URL lautet http://localhost:8501/socket.io/?EIO=3&transport=polling&t=1425998452675-5&sid=1VwKenkSONHg6-ddAABW , die Antwortnachricht lautete {"code":1,"message":"Session ID unknown"} . Als ich sah, dass das Protokoll von der Serverseite geschrieben wurde, fand ich den Socket 1VwKenkSONHg6-ddAABW wurde getrennt. Und schließlich konnte der Socket nicht erfolgreich wieder verbunden werden, und der Client und der Server konnten nicht miteinander kommunizieren.

Der Code, den ich verwende:

var socketIo = require('socket.io');
var redis = require('socket.io-redis');
var socket_handler = require('./socket_handler');
var config = require('../config');
const PREFIX_SOCKET_IO = 'socketIoPrefix:';
function SocketIoApp(httpServer) {
    this.httpServer = httpServer;
}

SocketIoApp.prototype.listen = function(port) {
    var io = socketIo(this.httpServer);
    var redisConfig = config.redisConfig;
    redisConfig.key = PREFIX_SOCKET_IO;
    io.adapter(redis(redisConfig));
    this.httpServer.listen(port);

    io.on('connection', function (socket) {
        console.log('socketid',socket.id,'connected');
        socket.emit('hello','hello');
        socket.on('msg', function (data) {
            socket_handler.process(socket,data,function(err) {
               //
            });
        });
        socket.on('disconnect', function () {
            console.log(socket.id + ' disconnect');
        });
    });
    this.io = io;
}

Alle 21 Kommentare

Haben Sie mehrere Serverprozesse als Server? In diesem Fall müssen Sie Sticky Session verwenden.

http://socket.io/docs/using-multiple-nodes/

@nkzawa : Hallo, vielen Dank für die Erwähnung. Ich habe tatsächlich herausgefunden, dass ich Cluster mit nodeJs im Produktionsmodus verwende, was die Dinge auf dem Server kaputt macht. Ich versuche, die Sticky-Session (https://github.com/indutny/sticky-session) mit meiner App zu konfigurieren, wie in nodeJs with clusteur section erwähnt, was letztendlich meinen Socket zerstört und jetzt erhalte ich einen Konsolenfehler wie

Socket auf Port 5858 konnte nicht geöffnet werden, es wurde 1000 ms gewartet, bevor es erneut versucht wurde
Socket auf Port 5858 konnte nicht geöffnet werden, es wurde 1000 ms gewartet, bevor es erneut versucht wurde
Socket auf Port 5858 konnte nicht geöffnet werden, es wurde 1000 ms gewartet, bevor es erneut versucht wurde
Socket auf Port 5858 konnte nicht geöffnet werden, es wurde 1000 ms gewartet, bevor es erneut versucht wurde
Socket auf Port 5858 konnte nicht geöffnet werden, es wurde 1000 ms gewartet, bevor es erneut versucht wurde

hast du eine ahnung was mir fehlt :-(

@nkzawa Bei Verwendung von socket.io-redis(https://github.com/automattic/socket.io-redis) wird gelegentlich die folgende Fehlermeldung angezeigt:

WebSocket connection to 'ws://localhost:8501/socket.io/?EIO=3&transport=websocket&sid=WPOeefk2cs-DsfLFAAAE' failed: Connection closed before receiving a handshake response

Sobald dieser Fehler auftrat, gab eine HTTP-Anforderung 400 zurück. Die Fehler-URL lautet http://localhost:8501/socket.io/?EIO=3&transport=polling&t=1425998452675-5&sid=1VwKenkSONHg6-ddAABW , die Antwortnachricht lautete {"code":1,"message":"Session ID unknown"} . Als ich sah, dass das Protokoll von der Serverseite geschrieben wurde, fand ich den Socket 1VwKenkSONHg6-ddAABW wurde getrennt. Und schließlich konnte der Socket nicht erfolgreich wieder verbunden werden, und der Client und der Server konnten nicht miteinander kommunizieren.

Der Code, den ich verwende:

var socketIo = require('socket.io');
var redis = require('socket.io-redis');
var socket_handler = require('./socket_handler');
var config = require('../config');
const PREFIX_SOCKET_IO = 'socketIoPrefix:';
function SocketIoApp(httpServer) {
    this.httpServer = httpServer;
}

SocketIoApp.prototype.listen = function(port) {
    var io = socketIo(this.httpServer);
    var redisConfig = config.redisConfig;
    redisConfig.key = PREFIX_SOCKET_IO;
    io.adapter(redis(redisConfig));
    this.httpServer.listen(port);

    io.on('connection', function (socket) {
        console.log('socketid',socket.id,'connected');
        socket.emit('hello','hello');
        socket.on('msg', function (data) {
            socket_handler.process(socket,data,function(err) {
               //
            });
        });
        socket.on('disconnect', function () {
            console.log(socket.id + ' disconnect');
        });
    });
    this.io = io;
}

Hallo, ich habe auch das gleiche Problem, gibt es dafür eine Lösung???

Ist das das gleiche Problem?

Ich sehe jede Menge Fehler, die sich alle paar Sekunden wiederholen, und die App funktioniert überhaupt nicht (ich verwende socket.io-redis mit zwei Websocket-Servern und Rackspace-Load-Balancer, TCP_CLIENT_FIRST)

WebSocket connection to 'ws://some.domain.com:5001/socket.io/?EIO=3&transport=websocket' failed: Connection closed before receiving a handshake response

und ich habe auch ein Protokoll .on ('connect_error', function ...) auf der Clientseite
Jedes Mal, wenn der Handshake-Fehler auftritt, bekomme ich auch:

Error: websocket error
    at WS.14.Transport.onError (http://192.168.1.72:9001/bower_components/socket.io-client/socket.io.js:2297:13)
    at WebSocket.19.WS.addEventListeners.ws.onerror (http://192.168.0.72:9001/bower_components/socket.io-client/socket.io.js:3436:10)

socket.io und socket.io-client-Bibliotheken sind beide Version 1.3.5

irgendwelche Ideen?

Sieht so aus, als ob socket.io einen Konflikt verursacht, wenn mehr als eine Socket-Verbindung auf einem Server verwendet wird. Ich habe die gleichen Probleme mit Liveload.

@nkzawa Sticky-Session vor 2 Jahren veröffentlicht. es war zuverlässig zu bedienen?

sticky-session und Klone sind schwerwiegend und gefährlich fehlerhaft, da sie die eingehende IP-Adresse für Lastausgleichszwecke verwenden und kein Verständnis für die Weiterleitung von Headern haben. Sobald Sie also bereit sind, tatsächlich in der Produktion bereitzustellen und Ihre Server hinter einer Last auszuführen balancer, da Sie aus Redundanzgründen auf mehreren Computern laufen oder einfach horizontal skalieren möchten, erhalten alle Knotenprozesse die IP-Adresse des Load Balancers, wodurch alle Anfragen an einen einzigen Prozess gehen.

Es ist also gut für eine temporäre Lösung, aber nicht etwas, das als produktionsfertige Lösung empfohlen werden sollte.

@3rd-Eden, haben Sie eine Lösung in der Produktumgebung oder einen Artikel darüber? Danke

@looping84 : Hallo, Sie können versuchen, den Redis-Server mit Ihrer Anwendung zu verwenden, die mir hilft.

Etwas verwandt ... eine andere Möglichkeit, dieselbe Fehlerzeichenfolge zu erhalten, besteht darin, die socket.io-Bibliothek zweimal zu initialisieren. Junge, ich wünschte, ich könnte diese zehn Minuten meines Lebens zurückhaben :stuck_out_tongue: .

http://stackoverflow.com/questions/26665840/socket-io-failed-connection-closed-before-receiving-a-handshake-response

Ich wünschte, mein Problem wäre so einfach :( Trotzdem gebe ich niemand anderem als mir selbst die Schuld

@eremzeit Ich wünschte ich könnte diese 2 Stunden meines Lebens zurück haben :P
Danke für die Anleitung. Es löste das Problem.

Es funktioniert gut mit ws, funktioniert aber nicht, wenn zu wss gewechselt wird.
Meine Fehlermeldung:

WebSocket-Verbindung zu „ wss://iosock.dayl.toancauxanh.vn :5432/socket.io/?token=eyJ0eXAiOiJKV1QiLCJh…HA1JyERt24hP2TIa-chetqE&EIO=3&transport=websocket&sid=6QWsRBRMUi1_CcDZAAA8“ fehlgeschlagen: Verbindung geschlossen, bevor eine Handshake-Antwort empfangen wurde

Wer hilft mir? Grüße

Ich habe das gleiche Problem, im Grunde hat das doppelte Verbinden den Fehler verursacht.

server.listen(8001);

/* io.listen(server);*/ <-- comment this

var listener = io.listen(server);
listener.sockets.on('connection', function(socket){
    socket.emit('message', {'message': 'hello world'});
});

Habe das Problem bei mir behoben.

Ich hatte dieses Problem auch und es stellte sich heraus, dass es sich um einen Konfigurationsfehler in meinem Webpack-Dev-Server-Proxy handelte. Für den Socket.io-Pfad fehlte der Parameter ws: true . Das Hinzufügen dieses Parameters hat das Problem behoben.

Hast du ws: true in deiner Webpack-Konfiguration hinzugefügt?

Ich erhalte diesen Fehler bei ~ der Hälfte meiner socket.io-Verbindungsversuche, wenn ich meine App in einem Cluster ohne Sticky Sessions ausführe.

Mein socket.io-Client ist mit transports: ['websocket'] konfiguriert.

@nkzawa Da ich nur den websocket Transport verwende, sollte ich keine Sticky-Sessions brauchen, oder?

Hat das jemand gesehen? Ich erhalte diesen Fehler in Safari, aber nicht in Chrome oder Firefox. Ich verwende socket.io 2.0.4. Dies funktioniert seit langem, und ich denke, Safari hat etwas aktualisiert. Wir verwenden auch eine Amazon ALB mit HTTP/2, um dies schwierig zu machen.

Safari HTTP/2 400 WebSocket is closed before the connection is established.

In meinem Fall trat der Fehler in browserSync auf.
Um das Problem zu beheben, musste ich den Parameter „ws: true“ in den browserSync-Optionen angeben.

Beispielsweise:
browserSync({
//...einige Optionen,
WS: stimmt
})

In meinem Fall habe ich rohes WebSocket verwendet

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen