我使用Socket.io創建與Node.js的WebSocket連接。在某些時候,我有一個阻塞主線程的長時間運行的函數,在發生這種情況之後,運輸(在這種情況下是websockets)似乎被Google Chrome本身關閉。谷歌瀏覽器看起來沒有理由的WebSocket
後臺沒有任何斷開連接消息,並且close
事件中的消息只是transport close
。
有沒有人知道這是怎麼發生的?我玩過Socket.io(pingTimeout
和pingInterval
)的超時時間,但這似乎對我的情況沒有任何影響。
編輯:好的我試圖改變pingTimeout
和pingInterval
服務器和客戶端上,但無濟於事..
這裏是我使用的代碼:
客戶:
this._socket = io(location.href, {
path: `${location.path}socket.io`,
reconnection: false,
pingTimeout: 120000,
pingInterval: 60000
});
服務器:
const server = http.createServer();
const io = socketio(server, {
pingTimeout: 120000,
pingInterval: 60000
});
要開始的地方是:「長時間運行的功能,阻止主要thead」。不是一個好主意。如果這是socket.io,那麼可能是因爲您不允許客戶端處理socket.io用來查看套接字是否仍然存在的ping/pong消息。另外,請向我們展示您的特定代碼以及您超時嘗試的內容。 「在暫停時玩耍」並沒有告訴我們你所嘗試的或者你設定的東西。有關代碼的問題應該包含您的實際代碼!我們在這裏的理論或假設問題做得很差,並且在真正的代碼上做得很好。 – jfriend00
Socket.io的心跳(ping/pong)超時時間默認爲60秒。我知道長時間運行的功能不是一個好主意,但在解決問題之前,我需要確切知道是什麼導致了斷開連接。谷歌瀏覽器可能因爲沒有心跳超時而斷開連接? 在此處添加代碼非常困難,因爲它實際上只是:連接到服務器,阻止主線程,不再連接。目前我使用這段代碼來模擬阻塞函數:'let a = 0; (let i = 0; i <10000000000; i ++){ a + = i; }' –
當你說你「玩了超時」,我想看看你試過的代碼是什麼。有一些設置,文檔不是很好。我想知道你實際上試過了什麼。向我們展示代碼。而且,你想要處理多長時間的運行功能?告訴我們多少秒。而且,你是否也控制了服務配置?在當前的問題中,根本沒有足夠的信息讓我們做任何事情,但根據定義,我們猜測的問題和猜測並不是非常完整的問題。 – jfriend00