Socket通信幾個概念

心跳流程

簡介:
所謂的心跳機制就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。代碼就是每隔若干時間發送一個固定信息給服務端,服務端收到後及時回覆一個固定信息,如果服務端若干時間內沒有收到客戶端心跳信息則視客戶端斷開,同理如果客戶端若干時間沒有收到服務端心跳回值則視服務端斷開。

客戶端開啓心跳流程圖

這裏寫圖片描述

描述:
客戶端初始化SDK後,同步開啓心跳輪訓線程,線程實現內部會判斷是否需要發送心跳協議(減少不必要的心跳協議請求),時刻監聽通道連接狀態。

Socket重連

當長連接被建立後,由於網絡的穩定性,以及人爲切換網絡等一系列的問題,並不能保證長連接一直保持通暢狀態,但是作爲用戶不會去注意網絡的狀態情況,他們關心的僅僅是APP的體驗,所以對開發人員來說,實現斷網重連功能,規避頻繁斷網帶來的體驗影響非常必要。

重連策略流程圖

這裏寫圖片描述
功能描述:
重連被觸發時,如果該次連接成功,退出重連。反之重連失敗後,會判斷當前重連的次數是否超過預期值(這裏設爲6次),並對重連次數計數,如果超過就會退出重連,反之休眠預設的時間後再次進行重連操作。

重連觸發條件

這裏寫圖片描述
描述:
重連觸發條件分爲四種:
1:主動連接不成功(主動連接Socket,如果連接失敗,會觸發重連機制)
2:網絡被主動斷開(正常建立連接,操作過程中,網絡被斷開,通過系統廣播觸發重連)
3:服務器沒響應,心跳沒回值(服務端心跳預設時間內沒回值,客戶端認爲服務端已經斷開,觸發重連)

網絡狀態判斷

Tcp API並沒有提供一個可靠的方法判斷當前長連接通道狀態,isConnected()和isClosed()僅僅告訴你當前的Socket狀態,不是同一回事。isConnected()告訴你是否Socket與Romote host保持連接,isClosed()告訴你是否Socket被關閉。

假如你想判斷長連接通道是否被關閉,只能通過以下方法:
1:read() return -1
2:readLine() return null
3:readXXX() throw EOPException for any other XXX
4: write 將拋出IOException: Broken pipe(通道被關閉)

所以SDK封裝isConnected()方法的時候,一定要根據這幾種情況綜合判斷當前的通道狀態,而不是僅僅通過Socket.isConnected()或者Socket.isClosed()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章