Socket.io - не удалось: соединение закрыто до получения ответа на подтверждение

Socket.io для NodeJS не работает как сервер веб-сервера

По какой-то причине socket.io ALWAYS возвращается к длинному опросу, и если я заставляю транспортный уровень websocket, он будет выходить из строя:

не удалось: соединение закрыто перед получением ответа на подтверждение

Правильные порты открыты. Я использую пример чата из socket.io. Я настроил сервер на http://jmi.io:3000. Как вы можете видеть, он отлично работает с красивым длинным каналом опроса, но теперь попробуйте соединение с веб-сайтами с клиентом websocket и...

Соединение с WebSocket с 'ws://jmi: 3000/' не выполнено: соединение закрыто перед получением ответа подтверждения

У меня есть только один node однопоточный и имеет тот же самый package.json, что и в примере репорта чата.

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

Спасибо за помощь

Ответы

Ответ 1

У меня была такая же проблема, потому что я дважды определял "io". Дважды проверьте, где вы определяете io в коде, и убедитесь, что вы не определяете переменную io дважды.

Пример того, что я делал неправильно:

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'));
}));

Пример того, что исправило проблему:

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'));
});

Ответ 2

Немного связанный с тем, что ответил @Lucas Klaassen: у меня было следующее:

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);

Изменение последней строки - это исправление:

http.listen(port);

Ответ 3

В моем случае проблема заключалась в том, что я проксировал сервер через browser-sync

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

Так что это не удастся, однако в производстве он отлично работает.

Ответ 4

Вот полный рабочий пример одного из наших рабочих проектов:

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');
});

переведено со среднего