當前位置:編程學習大全網 - 源碼下載 - netty 心跳包和斷線重連機制

netty 心跳包和斷線重連機制

心跳包主要是用來做TCP長連接保活的。有時 socket 雖然是連接的但中間網絡可能有問題,這時妳還在不停的往外發送數據,但對方是收不到的,妳不知道對方是不是還活著,不知道 socket 通道是不是還是聯通的。 心跳包就是妳發送壹些試探包給對方,對方回應,如果壹定時間內比如30秒內沒有收到任何數據,說明對方或網絡可能有問題了。這時妳主動斷開 socket 連接,避免浪費資源。

TCP keepAlive 也是在壹定時間內(默認2小時)socket 上沒有接收到數據時主動斷開連接,避免浪費資源,這時遠端很可能已經down機了或中間網絡有問題。也是通過發送壹系列試探包看有沒有回應來實現的。

TCP keepAlive 依賴操作系統,默認是關閉的,需要修改操作系統配置打開。

所以在應用層實現心跳包還是必須的。

這個是顯而易見的,正常通信時說明兩端連接是沒有問題的,所以只在空閑的時候發送心跳包。如果每隔固定時間發送就會浪費資源占用正常通信的資源。

假設現在要做壹個手機端推送的項目,所有手機通過 TCP 長連接連接到後臺服務器。心跳機制是這樣的:

看其他博客說不要回復,如果有 10萬空閑連接,光回復心跳包就要占用大量資源。服務端讀超時後直接關閉連接,客戶端再進行重連。

斷線重連也很簡單就是在 channelInactive 的時候重新 connect 就行了。參考其他博客專門用壹個 ChannelInboundHandler 來處理斷線重連。

這個 watchDog Handler 應當放在 ChannelPipeline 的最前面

其實客戶端和服務端都是相對的,這個看應用場景。如果客戶端想要及時處理斷網,路由故障等情況就需要接受服務端發來的心跳來檢測。像斷網,路由故障這種情況,兩邊都不知道TCP連接的狀態,必須靠心跳。長連接服務端壹般都要接收心跳包的,如果沒有心跳可能會有大量的無效連接,直接耗盡服務器資源,無效的連接要盡早關閉掉。

DEMO:

/lesliebeijing/Netty-Demo

基於 Netty 寫的壹個簡單的推送 DEMO,可用在手機端推送

/lesliebeijing/EncPush

Netty 客戶端用在 Android 中也很穩定,我們的物聯網項目Android和後臺都是用的 Netty。

  • 上一篇:如何制作安卓軟件
  • 下一篇:目前全球已經建成的盾艦戰力指數排名是怎樣的?
  • copyright 2024編程學習大全網