当 google chrome 中存在大量 websocket 连接时,socket io 会中断

我在 google chrome 浏览器中创建了 60 个到 socket.io 服务器的客户端连接。服务器在特定时间将屏幕截图发送给客户端。一些作为 socket.io 子协议的 websocket 连接被破坏,因此大约 1-4 个 chrome 选项卡的连接被关闭。我尝试增加 pingTimeout,它仅有助于克服 tcp 传输关闭问题(我也有这个问题),但此解决方案无助于解决发送屏幕截图问题。


在我看来,谷歌浏览器一次不能支持大约 50-60 个选项卡,因为 CPU 和 RAM 由于向 60 个客户端发送屏幕截图而增加到最大值(每个客户端有 2 个 websocket 连接:第一个用于简单消息,第一个用于简单消息)第二个用于图形(发送屏幕截图)),因此 chrome 会关闭一些 websocket 连接。


服务器套接字 io 的部分代码如下:


// server

this.http = this._createHttpServer(sslCert, sslKey);


this.io = socketIo(this.http, {

    'pingTimeout': 180000,

    'pingInterval': 60000

});


const jwtAuth = socketioJwt.authorize({

     secret: jwtSecret,

     timeout: 15000

});


this.io.on('connection', (socket) => {

    socket.once('authenticate', (data) => {

        socket.rawAuthData = data;

    });

    jwtAuth(socket);

});



// client

var connOptions = {

    "reconnectionAttempts": 2

};

var socket = io(options.url, connOptions);

socket.on('connect', function() {

    if (options.token) {

        socket.emit('authenticate', {token: options['token'], tag : tag});


        socket.on('authenticated', function() {

            ctx.printLog('Authorized. Waiting for handshake');

            socket.once('tunnel-handshake', function() {

                ctx.printLog('handshake received! connection is ready');

                processConnected();

            });

        }).on('unauthorized', function(msg) {

            ctx.printLog("Authorization failed: " + JSON.stringify(msg.data));

            eventHandlers.onerror({ code: ctx.ERROR_CODE.INVALID_TOKEN});

        });

    } else {

        processConnected();

    }

});


socket.on('reconnect_failed', eventHandlers.onerror.bind(this, {code: 1, reason: "Reconnection failed"}));

socket.on('disconnect', eventHandlers.onclose);

socket.on('error', eventHandlers.onerror);

是否存在任何想法,原因可能是什么?这个问题有解决办法吗?是 google chrome 问题还是 socket.io 选项问题?谢谢


动漫人物
浏览 385回答 1
1回答

翻翻过去那场雪

将socket.io更改为3.0版本无法解决该问题。socket.io v3.0有engine.io v4.0。我们收到了大量来自用户的报告,这些用户由于 ping 超时而遇到随机断开连接的情况,即使他们的互联网连接已接通且远程服务器可访问。应该指出的是,在这种情况下,客户端会立即重新连接,但这仍然是一个烦人的问题。经过分析,似乎是客户端定时器延迟导致的。这些计时器用于乒乓机制,有助于确保服务器和客户端之间的连接仍然健康。客户端延迟意味着客户端发送 ping 数据包太晚,服务器认为连接已关闭。这就是为什么服务器现在将发送 ping 数据包,而客户端将用 pong 数据包进行响应。但将 pingTimeout 和 pingInterval 值增加到 1073741823 可以解决该问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript