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

创建于 2015-03-09  ·  21评论  ·  资料来源: socketio/socket.io

你好

我在 MEAN.IO (https://github.com/linnovate/mean) 之上的项目构建中使用 socket.io。
我成功集成了库,在我的本地一切正常,控制台中没有错误。

但是在服务器上部署相同的代码时,它向我显示了一个错误

WebSocket 连接到 'ws://ip.ip.ip.ip:3000/socket.io/?EIO=3&transport=websocket&sid=OpeM3YIJqVuTnt-dAAAY' 失败:在收到握手响应之前连接已关闭

我现在已经为套接字提供了重新连接的选项: -

var socket = io.connect(baseUrl, {
“重新连接”:是的,
'重新连接延迟':1000,
'reconnectionDelayMax': 5000,
'forceNew':真
});

但有时套接字仍然处于非活动状态。

Handshakes

最有用的评论

@nkzawa在使用socket.io-redis(https://github.com/automattic/socket.io-redis)时,偶尔会出现如下错误信息:

WebSocket connection to 'ws://localhost:8501/socket.io/?EIO=3&transport=websocket&sid=WPOeefk2cs-DsfLFAAAE' failed: Connection closed before receiving a handshake response

一旦发生此错误,http 请求将返回 400。错误 url 是http://localhost:8501/socket.io/?EIO=3&transport=polling&t=1425998452675-5&sid=1VwKenkSONHg6-ddAABW ,它的返回消息是{"code":1,"message":"Session ID unknown"} 。当我看到服务器端写入的日志时,我找到了套接字1VwKenkSONHg6-ddAABW已断开连接,最后socket 无法重新连接成功,客户端和服务器无法相互通信。

我使用的代码:

var socketIo = require('socket.io');
var redis = require('socket.io-redis');
var socket_handler = require('./socket_handler');
var config = require('../config');
const PREFIX_SOCKET_IO = 'socketIoPrefix:';
function SocketIoApp(httpServer) {
    this.httpServer = httpServer;
}

SocketIoApp.prototype.listen = function(port) {
    var io = socketIo(this.httpServer);
    var redisConfig = config.redisConfig;
    redisConfig.key = PREFIX_SOCKET_IO;
    io.adapter(redis(redisConfig));
    this.httpServer.listen(port);

    io.on('connection', function (socket) {
        console.log('socketid',socket.id,'connected');
        socket.emit('hello','hello');
        socket.on('msg', function (data) {
            socket_handler.process(socket,data,function(err) {
               //
            });
        });
        socket.on('disconnect', function () {
            console.log(socket.id + ' disconnect');
        });
    });
    this.io = io;
}

所有21条评论

您是否有多个服务器进程作为您的服务器? 在这种情况下,您必须使用粘性会话。

http://socket.io/docs/using-multiple-nodes/

@nkzawa :您好,非常感谢您提到这一点,我实际上发现我在生产模式下使用带有 nodeJs 的集群,这会破坏服务器上的东西。 我尝试使用我的应用程序配置粘性会话(https://github.com/indutny/sticky-session),如 nodeJs with clusteur section 中提到的那样,这最终破坏了我的套接字,现在我得到一个控制台错误

在端口 5858 上打开套接字失败,等待 1000 毫秒后重试
在端口 5858 上打开套接字失败,等待 1000 毫秒后重试
在端口 5858 上打开套接字失败,等待 1000 毫秒后重试
在端口 5858 上打开套接字失败,等待 1000 毫秒后重试
在端口 5858 上打开套接字失败,等待 1000 毫秒后重试

你知道我错过了什么吗:-(

@nkzawa在使用socket.io-redis(https://github.com/automattic/socket.io-redis)时,偶尔会出现如下错误信息:

WebSocket connection to 'ws://localhost:8501/socket.io/?EIO=3&transport=websocket&sid=WPOeefk2cs-DsfLFAAAE' failed: Connection closed before receiving a handshake response

一旦发生此错误,http 请求将返回 400。错误 url 是http://localhost:8501/socket.io/?EIO=3&transport=polling&t=1425998452675-5&sid=1VwKenkSONHg6-ddAABW ,它的返回消息是{"code":1,"message":"Session ID unknown"} 。当我看到服务器端写入的日志时,我找到了套接字1VwKenkSONHg6-ddAABW已断开连接,最后socket 无法重新连接成功,客户端和服务器无法相互通信。

我使用的代码:

var socketIo = require('socket.io');
var redis = require('socket.io-redis');
var socket_handler = require('./socket_handler');
var config = require('../config');
const PREFIX_SOCKET_IO = 'socketIoPrefix:';
function SocketIoApp(httpServer) {
    this.httpServer = httpServer;
}

SocketIoApp.prototype.listen = function(port) {
    var io = socketIo(this.httpServer);
    var redisConfig = config.redisConfig;
    redisConfig.key = PREFIX_SOCKET_IO;
    io.adapter(redis(redisConfig));
    this.httpServer.listen(port);

    io.on('connection', function (socket) {
        console.log('socketid',socket.id,'connected');
        socket.emit('hello','hello');
        socket.on('msg', function (data) {
            socket_handler.process(socket,data,function(err) {
               //
            });
        });
        socket.on('disconnect', function () {
            console.log(socket.id + ' disconnect');
        });
    });
    this.io = io;
}

您好,我也遇到了同样的问题,请问有解决方法吗???

这是同一个问题吗?

我看到大量错误,每隔几秒钟重复一次,并且应用程序根本无法运行(我使用的是 socket.io-redis,有两个 websocket 服务器和机架空间负载均衡器,TCP_CLIENT_FIRST)

WebSocket connection to 'ws://some.domain.com:5001/socket.io/?EIO=3&transport=websocket' failed: Connection closed before receiving a handshake response

而且我在客户端也有一个日志 .on('connect_error', function...)
每次发生握手错误时,我也会得到:

Error: websocket error
    at WS.14.Transport.onError (http://192.168.1.72:9001/bower_components/socket.io-client/socket.io.js:2297:13)
    at WebSocket.19.WS.addEventListeners.ws.onerror (http://192.168.0.72:9001/bower_components/socket.io-client/socket.io.js:3436:10)

socket.io 和 socket.io-client 库都是 1.3.5 版本

有任何想法吗?

在服务器上使用超过 1 个套接字连接时,socket.io 似乎发生冲突。 我对 livereload 有同样的问题。

@nkzawa粘性会话 2 年前发布。 使用可靠吗?

sticky-session和克隆存在严重且危险的缺陷,因为它们使用传入的 IP 地址进行负载平衡,并且不了解转发标头,因此一旦您准备好在生产中实际部署并在负载后运行服务器当您想要在多台机器上运行以实现冗余或只是横向扩展时,所有节点进程都将接收负载均衡器的 IP 地址,从而导致所有请求都转到单个进程。

因此,这对于临时解决方案很有用,但不应该建议作为生产就绪解决方案。

@3rd-Eden 你有产品环境的解决方案或任何关于它的文章吗? 谢谢

@looping84 :您好,您可以尝试在您的应用程序中使用 Redis 服务器来帮助我。

稍微相关...获得相同错误字符串的另一种方法是初始化socket.io库两次。 男孩,我希望我能回到我生命中的那十分钟 :stuck_out_tongue: 。

http://stackoverflow.com/questions/26665840/socket-io-failed-connection-closed-before-receiving-a-handshake-response

我希望我的问题就这么简单:(我仍然不怪任何人,除了我自己

@eremzeit我希望我能恢复我生命中的那两个小时:P
感谢您的指导。 它解决了这个问题。

使用 ws 可以正常工作,但更改为 wss 时无法正常工作。
我的错误信息:

WebSocket 连接到“ wss://iosock.dayl.toancauxanh.vn :5432/socket.io/?token=eyJ0eXAiOiJKV1QiLCJh…HA1JyERt24hP2TIa-chetqE&EIO=3&transport=websocket&sid=6QWsRBRMui1_CcDZAAA8”失败:连接在收到握手响应之前关闭

谁帮我? 问候

我遇到了同样的问题,基本上是连接双精度导致错误。

server.listen(8001);

/* io.listen(server);*/ <-- comment this

var listener = io.listen(server);
listener.sockets.on('connection', function(socket){
    socket.emit('message', {'message': 'hello world'});
});

为我解决了这个问题。

我也遇到了这个问题,结果是我的 webpack 开发服务器代理中的配置错误。 socket.io 路径缺少参数ws: true 。 添加该参数解决了这个问题。

您是否在 webpack 配置中添加了 ws: true ?

没有粘性会话的集群中运行我的应用程序时,我在大约一半的 socket.io 连接尝试中收到此错误。

我的 socket.io 客户端配置了transports: ['websocket']

@nkzawa鉴于我只使用websocket传输,我不应该需要粘性会话,对吗?

有人见过这个吗? 我在 Safari 中收到此错误,但不是 Chrome 或 Firefox。 我正在使用 socket.io 2.0.4。 这已经工作了很长时间,我认为 Safari 更新了一些东西。 我们还使用带有 HTTP/2 的 Amazon ALB 来帮助解决这个问题。

Safari HTTP/2 400 WebSocket is closed before the connection is established.

就我而言,错误发生在 browserSync 中。
要修复它,我需要在 browserSync 选项中指定参数“ws: true”。

例如:
浏览器同步({
//...一些选项,
ws:是的
})

就我而言,我使用的是原始WebSocket

此页面是否有帮助?
0 / 5 - 0 等级