首页 文章

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

提问于
浏览
18

Socket.io for NodeJS doesn't seem to work as a websocket server

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

failed:在收到握手响应之前关闭连接

正确的端口是开放的 . 我正在使用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"
  }
}

谢谢您的帮助

4 回答

  • 4

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

    在我的情况下,问题是我通过 browser-sync 代理服务器

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

    所以这将失败,但在 生产环境 中它工作正常 .

  • 28

    与@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);
    
  • 2

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

    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

相关问题