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

Posted

技术标签:

【中文标题】Socket.io - 失败:连接在收到握手响应之前关闭【英文标题】:Socket.io - failed: Connection closed before receiving a handshake response 【发布时间】: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"
  

感谢您的帮助

【问题讨论】:

这个问题你解决了吗? 【参考方案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) 两次!

以上是关于Socket.io - 失败:连接在收到握手响应之前关闭的主要内容,如果未能解决你的问题,请参考以下文章

rxjs/webSocket - 到“ws://localhost:3000/”的 WebSocket 连接失败:连接在收到握手响应之前关闭

socket.io 在 x 秒/第一次尝试获取响应失败后停止重新发出事件

socket io发出失败的回调

WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis

WebSocket 连接到“ws://.../socket.io/”失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET

在 socket.io 中与握手数据一起发送自定义数据?