2013-12-13 209 views
3

我使用socket.io與node.js,我喜歡解決方案。我注意到的唯一問題是斷開連接和重新連接。socket.io客戶端重新連接超時

這是我的當前設置:

'connect timeout': 1000, 
    'reconnect': true, 
    'reconnection delay': 300, 
    'max reconnection attempts': 10000, 
    'force new connection':true 

我發現,如果我停止和啓動Node.js的處理客戶端連接回精和快,但是如果服務器幾分鐘的客戶端離線要麼不重新連接,要麼需要非常長的時間(非用戶友好的)。

我想問問是否有任何我錯過了或可以添加到socket.io配置,以保持客戶端輪詢重新連接。

我知道「重新連接延遲」:

重新連接延時默認爲500毫秒

初始超時開始重新連接,這是用增加的 指數退避算法每次新重聯已嘗試 。

但是它的指數效應不是非常用戶友好。是否有一種方法可以每隔X個時間週期檢查一次連接 - 例如:5秒。

如果不是,我想我可以寫一些客戶端JS來檢查連接,並嘗試重新連接,如果需要但它會很好,如果socket.io客戶端提供了這一點。

THX

回答

4

恐怕重新連接算法不能被修改(截至12月2013年);允許此功能的Github issue尚未合併。然而,評論者之一是在暗示一個小的解決辦法,這應該抵消了指數增長:

socket.socket.reconnectionDelay /= 2reconnecting

另一種方法是,如你所說,寫一些客戶端代碼覆蓋重新連接行爲,並進行輪詢。這是如何完成這個的example

編輯:上面的代碼將不得不去的「斷開」事件回調中:

var socket = io('http://localhost'); 
socket.on('connect', function(){ 
    socket.on('disconnect', function(){ 
     socket.socket.reconnectionDelay /= 2; 
    }); 
}); 
+0

有沒有關於上述解決方法在代碼中的位置的任何信息?客戶端我假設,但在代碼中? – Adam

+0

看起來像它的黑客socket.io-client.js文件... – Adam

+0

解決方法將進入您的'斷開'事件處理程序。檢查我的編輯 – verybadalloc

3

這是我去的解決方案 - 當插座斷開它進入一個循環,不斷嘗試重新連接每3秒鐘後直到建立了連接 - 工程請客:

socket.on('disconnect', function() { 
    socketConnectTimeInterval = setInterval(function() { 
     socket.socket.reconnect(); 
     if(socket.socket.connected) {clearInterval(socketConnectTimeInterval);} 
    }, 3000); 
    }); 

歡呼

18

有一個配置選項,reconnection limit(見Configuring Socket.IO):

重新連接限制默認爲Infinity

  • 最大重連接延遲以毫秒爲單位,或無窮大。

它可以進行如下設置:

io.set("reconnection limit", 5000); 

設置後,重新連接的延遲將繼續增加(根據指數退避算法),但只到最大值你指定。

+3

這完全回答了問題,應該標記爲正確的答案。 –

相關問題