我在 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条经验 获得超14个赞
将socket.io更改为3.0版本无法解决该问题。socket.io v3.0有engine.io v4.0。
我们收到了大量来自用户的报告,这些用户由于 ping 超时而遇到随机断开连接的情况,即使他们的互联网连接已接通且远程服务器可访问。应该指出的是,在这种情况下,客户端会立即重新连接,但这仍然是一个烦人的问题。
经过分析,似乎是客户端定时器延迟导致的。这些计时器用于乒乓机制,有助于确保服务器和客户端之间的连接仍然健康。客户端延迟意味着客户端发送 ping 数据包太晚,服务器认为连接已关闭。
这就是为什么服务器现在将发送 ping 数据包,而客户端将用 pong 数据包进行响应。
但将 pingTimeout 和 pingInterval 值增加到 1073741823 可以解决该问题。
添加回答
举报
0/150
提交
取消