it-swarm.com.de

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

Socket.io für NodeJS scheint nicht als Websocket-Server zu funktionieren

Aus irgendeinem Grund ist socket.io IMMER ein Rückfall auf die lange Abfrage und wenn ich die Websocket-Transportschicht erzwinge, wird ein Fehler ausgegeben:

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

Die richtigen Ports sind offen. Ich verwende das chat Beispiel from socket.io . Ich habe den Server auf http://jmi.io:3000 eingerichtet. Wie Sie sehen, funktioniert es gut mit einem schönen langen Polling-Kanal, aber probieren Sie jetzt die Websocket-Verbindung von einem Websocket-Client aus und ...

WebSocket-Verbindung zu 'ws: // jmi: 3000 /' ist fehlgeschlagen: Verbindung wurde geschlossen, bevor eine Handshake-Antwort empfangen wurde 

Ich habe nur einen einzigen Knoten und habe genau das gleiche package.json wie im Chat-Beispiel.

{
  "name": "socket-chat-example",
  "version": "0.0.1",
  "description": "my first socket.io app",
  "dependencies": {
    "express": "4.3.1",
    "socket.io": "1.2.0"
  }
}

Danke für deine Hilfe

19
Jean Meyer

Ich hatte genau das gleiche Problem, weil ich 'io' zweimal definierte. Prüfen Sie, wo Sie in Ihrem Code Io definieren, und stellen Sie sicher, dass Sie die Variable Io nicht zweimal definieren.

Beispiel für das, was ich falsch gemacht habe:

var server = require('http').createServer(app);
var io = require('socket.io')(server);

var io = require('socket.io').listen(server.listen(config.port, config.ip, function () {
    console.log('Express server listening on %d, in %s mode', config.port,     
    app.get('env'));
}));

Beispiel dafür, was das Problem behoben hat:

var server = require('http').createServer(app);
var io = require('socket.io')(server);

server.listen(config.port, config.ip, function () {
    console.log('Express server listening on %d, in %s mode', config.port, 
    app.get('env'));
});
28
jetset

In meinem Fall bestand das Problem darin, dass ich den Server über browser-sync

browserSync({
    //server: {
    //  // src is included for use with sass source maps
    //  baseDir: ['public', 'src']
    //},
    proxy: "localhost:4045",
    port: 4046

Das wird also fehlschlagen, aber in der Produktion funktioniert es gut.

4
Jamie Hutber

Leicht verwandt mit dem, was @Lucas Klaassen antwortete: Ich hatte folgendes:

let express = require('express');
let app = express();
let http = require('http').Server(app);
let io = require('socket.io')(http);
// this is the culprit:
app.listen(port);

Das Ändern der letzten Zeile ist das, was es behoben hat:

http.listen(port);
3
Andy

Hier ist das vollständige Arbeitsbeispiel aus einem unserer Arbeitsprojekte:

const websocket = require('ws');
const http = require('http');
const express = require('express');
const app = express();
const server = http.createServer(app);
wss = new websocket.Server({ server });
app.on('upgrade', wss.handleUpgrade);

wss.on('connection', ws => {
  console.log('web socket connection is alive');
}

server.listen(8080, () => {
    console.log('server started on PORT 8080');
});

übersetzt aus Medium

0
student