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。