为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

动漫人物 2023-08-05 10:16:54
我在 google chrome 浏览器中创建了 60 个到 socket.io 服务器的客户端连接。服务器在特定时间将屏幕截图发送给客户端。一些作为 socket.io 子协议的 websocket 连接被破坏,因此大约 1-4 个 chrome 选项卡的连接被关闭。我尝试增加 pingTimeout,它仅有助于克服 tcp 传输关闭问题(我也有这个问题),但此解决方案无助于解决发送屏幕截图问题。在我看来,谷歌浏览器一次不能支持大约 50-60 个选项卡,因为 CPU 和 RAM 由于向 60 个客户端发送屏幕截图而增加到最大值(每个客户端有 2 个 websocket 连接:第一个用于简单消息,第一个用于简单消息)第二个用于图形(发送屏幕截图)),因此 chrome 会关闭一些 websocket 连接。服务器套接字 io 的部分代码如下:// serverthis.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);});// clientvar 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 选项问题?谢谢
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

将socket.io更改为3.0版本无法解决该问题。socket.io v3.0engine.io v4.0

我们收到了大量来自用户的报告,这些用户由于 ping 超时而遇到随机断开连接的情况,即使他们的互联网连接已接通且远程服务器可访问。应该指出的是,在这种情况下,客户端会立即重新连接,但这仍然是一个烦人的问题。

经过分析,似乎是客户端定时器延迟导致的。这些计时器用于乒乓机制,有助于确保服务器和客户端之间的连接仍然健康。客户端延迟意味着客户端发送 ping 数据包太晚,服务器认为连接已关闭。

这就是为什么服务器现在将发送 ping 数据包,而客户端将用 pong 数据包进行响应。

但将 pingTimeout 和 pingInterval 值增加到 1073741823 可以解决该问题。


查看完整回答
反对 回复 2023-08-05
  • 1 回答
  • 0 关注
  • 365 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信