我有移動客戶端連接到node.js服務器,通過xhr-polling運行socket.io。我有兩個類型的客戶:控制來自socket.io客戶端的心跳超時
A型
當連接打破了由於網絡問題(或者說 客戶端崩潰),默認的心臟跳動超時過長
B型
當這個客戶端的連接中斷時,我需要給它更多的時間 恢復 - 客戶端恢復比 更重要服務器中斷連接/會話
所以我的問題是如何從實際客戶端配置(如果有可能)心跳超時?
我有移動客戶端連接到node.js服務器,通過xhr-polling運行socket.io。我有兩個類型的客戶:控制來自socket.io客戶端的心跳超時
A型
當連接打破了由於網絡問題(或者說 客戶端崩潰),默認的心臟跳動超時過長
B型
當這個客戶端的連接中斷時,我需要給它更多的時間 恢復 - 客戶端恢復比 更重要服務器中斷連接/會話
所以我的問題是如何從實際客戶端配置(如果有可能)心跳超時?
據我所知,這裏有兩個重要的值:服務器每heartbeat interval
秒發送心跳到客戶端;客戶端直接響應,如果沒有響應,則服務器決定客戶端已經死亡。客戶端自上次心跳(顯然應高於heartbeat interval
)以來等待來自服務器的心跳爲heartbeat timeout
秒。如果還沒有在heartbeat timeout
秒從服務器接收到的話,它假定服務器是死的(並開始斷開/根據您所設定的其他選項重新連接。
默認值是heartbeat interval = 25s
和heartbeat 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黑客,你應該能夠做到這一點,但你可能會破壞其他的東西,在這個過程中...
要完成克勞德的回答,您可以設置這些值在服務器槓桿,用下面的代碼
io.set('heartbeat interval', 5);
io.set('heartbeat timeout', 11);
然後可以創建2臺的node.js服務器,一個用於每個類型的客戶端(A和B)的,具有2個期望的選項(心跳超時和間隔集)。
是否可以在任何文檔中找到? – youbetternot
不幸的是,我還沒有在任何文檔中找到這個,反正它相當短。但在實踐中,我注意到使用上面的代碼,這些值實際上發生了變化。 – radu122
此答案適用於socket.io 0.9。*。 socket.io/lib/master.js中的文檔。 –
在socket.io 1.x中,API已更改,但概念保持不變。
而不是heartbeatInterval和heartbeatTimeout,屬性是pingInterval和pingTimeout。例如,
var server = app.listen(80);
io = socketio(server,{'pingInterval': 45000});
看到http://socket.io/docs/server-api/#server(opts:object)的文檔,這將引導您到https://github.com/Automattic/engine.io#methods-1。
不確定心跳超時,但是如果你使用的是socket.io-client,有一些有用的選項可以幫助你,比如'connect timeout''重新連接延遲''max reconnection attempts' – vinayr