2016-04-21 92 views
2

我想保持Websocket連接活動一段時間不確定。理想情況下,套接字將每隔一段時間發送一次數據,但這並不確定,而且我也不想做出假設,因爲用戶可能處於空閒狀態。我需要'ping'連接的websocket連接嗎?

我有一個存儲對所有websocket連接的引用的對象。我每隔幾分鐘安排一次功能是否合適?秒?基本上遍歷所有的連接,ping他們,然後丟棄那些沒有收到歌曲?或者我是否需要啓用一個自動保持連接活動的標誌?

我在我的服務器上使用了ws庫,但在客戶端本地創建了websocket連接。

+1

我反對這個。如果一些在連接中間負責某個路由器或其他設備的netadmin已經認定通過它的連接足夠寶貴,那麼你真的沒有企圖欺騙他/不這樣做。在任何情況下,您都無法阻止它發生:您仍然必須處理丟失的連接;那麼好處在哪裏?值得注意的是,大約是地球上最常用的應用協議的HTTP並不這樣做。 – EJP

+0

那麼你會如何排除陳舊的連接?在這種情況下,陳舊意味着他們沒有發出關閉事件,但不再可用。 –

+0

socket.io(使用webSocket連接)將常規ping添加到檢測舊的連接,並幫助防止網絡基礎結構超時不活動的連接。這是非常可行的(webSocket協議甚至定義了乒乓球數據包),或者你可以在客戶端和服務器上使用socket.io,它會爲你做。 – jfriend00

回答

1

從客戶端到目標服務器的網絡路徑中,沒有什麼好方法可以讓客戶端知道有多少代理,防火牆,NAT,。其中任何一個都可以有自己獨立的空閒計時器。使用TCP keepalive 可能會工作,但只有從您的客戶端到下一跳的TCP會話 - 可能實際上也可能不是終端服務器。

鑑於上述情況,我會定期推薦,你應該您連接的WebSocket會話。無論你從服務器接收到乒乓球,從保持你的連接在網絡中間盒鏈(可能錯綜複雜)的連貫性角度看,都是不相關的;您只需確保路徑上的所有內容都能看到部分流量正在流動以重置其空閒計時器。

顯然你想平衡多久你連接你的連接WebSocket會話與多少開銷發生;例如,每1秒執行一次ping就會有點多。您可能需要進行一些微調以確定實驗性的ping間隔是否符合您的需求。

希望這會有所幫助!