Socket.io - 失败:在收到握手响应之前连接已关闭

时间:2014-10-31 00:45:17

标签: node.js websocket socket.io

NodeJS的Socket.io似乎不能用作websocket服务器

出于某种原因,socket.io总是回退到长轮询,如果我强制使用websocket传输层,它将会出错:

  

失败:在收到握手响应之前连接已关闭

正确的端口是开放的。我正在使用socket.io中的chat example。 我在http://jmi.io:3000上设置了服务器。正如你所看到的,它可以很好地使用漂亮的长轮询通道,但现在尝试使用websocket客户端的websocket连接......

  

与'ws:// jmi:3000 /'的WebSocket连接失败:在收到握手响应之前连接已关闭

我只有一个单线程节点,并且与聊天示例repo中的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"
  }
}

感谢您的帮助

5 个答案:

答案 0 :(得分:28)

我有完全相同的问题,因为我两次定义'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'));
});

答案 1 :(得分:4)

在我的情况下,问题是我通过browser-sync

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

所以这会失败,但在生产中它运作良好。

答案 2 :(得分:4)

与@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 :(得分:0)

以下是我们的一个工作项目的完整工作示例:

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

translated from Medium

答案 4 :(得分:0)

对我有用!

restUrl = 'http://x.x.x.x:5555;

socket = io(this.restUrl, {
        transports: ["websocket"],
        upgrade: true,
        upgradeTimeout: 6000000,
        pingTimeout: 15000000000,
        pingInterval: 1500000000,
        maxHttpBufferSize: 10000000,
      });

connect() {
        if (this.socket.connected == false) {
            var temp = this;
            this.socket.connect();
            this.socket.on('event', function (data) {
                temp.socketData.next(data);
            });
        }
    }