動漫人物
2023-08-05 10:16:54
我在 google chrome 瀏覽器中創(chuàng)建了 60 個到 socket.io 服務(wù)器的客戶端連接。服務(wù)器在特定時間將屏幕截圖發(fā)送給客戶端。一些作為 socket.io 子協(xié)議的 websocket 連接被破壞,因此大約 1-4 個 chrome 選項卡的連接被關(guān)閉。我嘗試增加 pingTimeout,它僅有助于克服 tcp 傳輸關(guān)閉問題(我也有這個問題),但此解決方案無助于解決發(fā)送屏幕截圖問題。在我看來,谷歌瀏覽器一次不能支持大約 50-60 個選項卡,因為 CPU 和 RAM 由于向 60 個客戶端發(fā)送屏幕截圖而增加到最大值(每個客戶端有 2 個 websocket 連接:第一個用于簡單消息,第一個用于簡單消息)第二個用于圖形(發(fā)送屏幕截圖)),因此 chrome 會關(guān)閉一些 websocket 連接。服務(wù)器套接字 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貢獻(xiàn)2065條經(jīng)驗 獲得超14個贊
將socket.io更改為3.0版本無法解決該問題。socket.io v3.0有engine.io v4.0。
我們收到了大量來自用戶的報告,這些用戶由于 ping 超時而遇到隨機(jī)斷開連接的情況,即使他們的互聯(lián)網(wǎng)連接已接通且遠(yuǎn)程服務(wù)器可訪問。應(yīng)該指出的是,在這種情況下,客戶端會立即重新連接,但這仍然是一個煩人的問題。
經(jīng)過分析,似乎是客戶端定時器延遲導(dǎo)致的。這些計時器用于乒乓機(jī)制,有助于確保服務(wù)器和客戶端之間的連接仍然健康??蛻舳搜舆t意味著客戶端發(fā)送 ping 數(shù)據(jù)包太晚,服務(wù)器認(rèn)為連接已關(guān)閉。
這就是為什么服務(wù)器現(xiàn)在將發(fā)送 ping 數(shù)據(jù)包,而客戶端將用 pong 數(shù)據(jù)包進(jìn)行響應(yīng)。
但將 pingTimeout 和 pingInterval 值增加到 1073741823 可以解決該問題。
添加回答
舉報
0/150
提交
取消