2012-10-10 169 views
14

我有移動客戶端連接到node.js服務器,通過xhr-polling運行socket.io。我有兩個類型的客戶:控制來自socket.io客戶端的心跳超時

  • A型

    當連接打破了由於網絡問題(或者說 客戶端崩潰),默認的心臟跳動超時過長

  • B型

    當這個客戶端的連接中斷時,我需要給它更多的時間 恢復 - 客戶端恢復比 更重要服務器中斷連接/會話

所以我的問題是如何從實際客戶端配置(如果有可能)心跳超時?

+1

不確定心跳超時,但是如果你使用的是socket.io-client,有一些有用的選項可以幫助你,比如'connect timeout''重新連接延遲''max reconnection attempts' – vinayr

回答

42

據我所知,這裏有兩個重要的值:服務器每heartbeat interval秒發送心跳到客戶端;客戶端直接響應,如果沒有響應,則服務器決定客戶端已經死亡。客戶端自上次心跳(顯然應高於heartbeat interval)以來等待來自服務器的心跳爲heartbeat timeout秒。如果還沒有在heartbeat timeout秒從服務器接收到的話,它假定服務器是死的(並開始斷開/根據您所設定的其他選項重新連接。

默認值是heartbeat interval = 25sheartbeat timeout = 60s。兩個品種。在服務器上設置,heartbeat timeout是在連接發送到客戶端

改變heartbeat timeout針對單個客戶端很簡單:

var socket = io.connect(url); 
socket.heartbeatTimeout = 20000; // reconnect if not received heartbeat for 20 seconds 

但是在服務器上,該heartbeat interval值似乎是部分的共享對象(管理器,這是您從var io = require("socket.io").listen(server)調用中獲得的內容),這意味着它不能輕易更改爲單個套接字。

我敢肯定,隨着一些socket.io黑客,你應該能夠做到這一點,但你可能會破壞其他的東西,在這個過程中...

+0

謝謝..非常有幫助答案確實 – Charmie

+1

真棒答案.....我想給100票ups ..感謝....很多.. –

+2

而不是看到http://stackoverflow.com/a/31146441/671457 @ Joseph238的答案如果你'像我一樣從未來開始。 – Capaj

11

要完成克勞德的回答,您可以設置這些值在服務器槓桿,用下面的代碼

io.set('heartbeat interval', 5); 
io.set('heartbeat timeout', 11); 

然後可以創建2臺的node.js服務器,一個用於每個類型的客戶端(A和B)的,具有2個期望的選項(心跳超時和間隔集)。

+0

是否可以在任何文檔中找到? – youbetternot

+1

不幸的是,我還沒有在任何文檔中找到這個,反正它相當短。但在實踐中,我注意到使用上面的代碼,這些值實際上發生了變化。 – radu122

+1

此答案適用於socket.io 0.9。*。 socket.io/lib/master.js中的文檔。 –