【问题标题】:Socket.io - failed: Connection closed before receiving a handshake responseSocket.io - 失败:连接在收到握手响应之前关闭
【发布时间】:2014-12-27 06:03:12
【问题描述】:

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"
  }
}

感谢您的帮助

【问题讨论】:

  • 这个问题你解决了吗?

标签: node.js websocket socket.io


【解决方案1】:

它对我有用!

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

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 为什么?这对我来说毫无意义
      • 发现 app var 实际上不是服务器,只是可以传递给服务器的常规 js obj。但是,它有一个名为“listen”的方便功能,虽然你认为它与 http 服务器的监听 http.listen 相同,但它具有误导性。但另一方面,http 监听返回服务器。所以你可以server = app.listen(....).. io = require('socket.io')(server)
      • @MuhammadUmer 谢谢!!你的评论对我帮助很大
      【解决方案4】:

      就我而言,问题是我通过browser-sync代理服务器

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

      所以这会失败,但在生产中它工作正常。

      【讨论】:

      • 太棒了。这也是我的问题。
      • 为了解决 BrowserSync 的问题,您可以设置 ws : true。例如:proxy: {target: localhost, ws: true}。它在我的项目中运行良好。
      • ws: true 并没有为我解决问题。我仍然收到相同的错误消息。还有其他方法吗?
      【解决方案5】:

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

      【讨论】:

      • 就我而言,我在两个不同的地方调用 require('socket.io')(server)
      • 该死!这也发生在我身上!谢谢你的回答。
      • 在我的情况下,是 2 个监听电话似乎破坏了我的连接。
      • 我这边也有同样的问题。我从某个示例中找到了一些代码,看起来像这样:var socketIo = require('socket.io');var sio = socketIo.listen(httpServer);sio.serveClient(true);sio.attach(httpServer); attach 和 listen 必须做同样的事情并导致它崩溃。
      • 你就是那个男人!我还调用了 require('socket.io')(server) 两次!
      猜你喜欢
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 2019-07-10
      • 2016-06-21
      • 2017-12-12
      • 2020-08-17
      • 1970-01-01
      • 2015-06-18
      相关资源
      最近更新 更多