2017-06-23 217 views
-2

我使用Socket.io創建與Node.js的WebSocket連接。在某些時候,我有一個阻塞主線程的長時間運行的函數,在發生這種情況之後,運輸(在這種情況下是websockets)似乎被Google Chrome本身關閉。谷歌瀏覽器看起來沒有理由的WebSocket

後臺沒有任何斷開連接消息,並且close事件中的消息只是transport close

有沒有人知道這是怎麼發生的?我玩過Socket.io(pingTimeoutpingInterval)的超時時間,但這似乎對我的情況沒有任何影響。

編輯:好的我試圖改變pingTimeoutpingInterval服務器和客戶端上,但無濟於事..

這裏是我使用的代碼:

客戶:

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 
}); 
+0

要開始的地方是:「長時間運行的功能,阻止主要thead」。不是一個好主意。如果這是socket.io,那麼可能是因爲您不允許客戶端處理socket.io用來查看套接字是否仍然存在的ping/pong消息。另外,請向我們展示您的特定代碼以及您超時嘗試的內容。 「在暫停時玩耍」並沒有告訴我們你所嘗試的或者你設定的東西。有關代碼的問題應該包含您的實際代碼!我們在這裏的理論或假設問題做得很差,並且在真正的代碼上做得很好。 – jfriend00

+0

Socket.io的心跳(ping/pong)超時時間默認爲60秒。我知道長時間運行的功能不是一個好主意,但在解決問題之前,我需要確切知道是什麼導致了斷開連接。谷歌瀏覽器可能因爲沒有心跳超時而斷開連接? 在此處添加代碼非常困難,因爲它實際上只是:連接到服務器,阻止主線程,不再連接。目前我使用這段代碼來模擬阻塞函數:'let a = 0; (let i = 0; i <10000000000; i ++){ a + = i; }' –

+0

當你說你「玩了超時」,我想看看你試過的代碼是什麼。有一些設置,文檔不是很好。我想知道你實際上試過了什麼。向我們展示代碼。而且,你想要處理多長時間的運行功能?告訴我們多少秒。而且,你是否也控制了服務配置?在當前的問題中,根本沒有足夠的信息讓我們做任何事情,但根據定義,我們猜測的問題和猜測並不是非常完整的問題。 – jfriend00

回答

1

每說明在this answer - Controlling the heartbeat from the client,你有兩個問題需要conncered約:

1)服務器發送心跳到客戶端,然後等待響應一些超時時間。如果沒有響應被髮回,那麼服務器假定套接字沒有運行並關閉它。

2)客戶端等待來自服務器的心跳一段時間,如果它確實收到心跳,那麼它假定套接字沒有運行並關閉它並嘗試重新連接。

因此,要延長您的套接字在沒有活動的情況下可以持續的時間段,您必須更改連接的客戶端和服務器端的時間。僅在客戶端上更改它不會阻止服務器關閉它未能獲得對其心跳消息的響應的連接。更多關於如何改變這些心跳間隔和超時的討論:Controlling the heartbeat timeout from the client in socket.io

在閱讀本主題時,請注意您正在閱讀的內容適用於socket.io 1.x版本而不適用於較舊版本,因爲很多內容都隨1 。X。

+0

我確實嘗試在服務器上單獨執行此操作。感謝您的輸入,我會閱讀您鏈接的帖子,看看他們是否幫助我。 –

+0

@robin_f - 您需要在客戶端和服務器上配置較長的超時時間。 – jfriend00

+0

我試過了,它仍然關閉,錯誤代碼爲1005,循環完成後沒有消息。即使有一個愚蠢的超時和間隔。我更新了原來的問題。 –