IM-客戶端和服務器斷開重連機制

客戶端和服務器斷開連接有兩種情況:1.手機網絡斷開連接, 2.手機和服務器端口連接;

1.手機網絡斷開連接

   添加一個Broadcastreceiver廣播接收器,監聽到網絡連接以後,調用重連方法進行重連;

2.服務器斷開連接

2.1 服務器設置閒置自動斷開

爲了減輕服務器壓力,可以設置閒置超過設定的時間後就自動斷開連接。

爲了解決這種情況,可以設置一個心跳功能,利用輪詢的方式,每隔一定時間發送一個數據包到服務器;

//是否已經斷開連接
    boolean isDone=false;
    class HeartBeatThread extends Thread{
        @Override
        public void run() {
            try {
                while(!isDone){//連接沒有斷開
                    //發送數據包到服務器
                      ...
                    //
                    //設置發送間隔,這個時間要小於服務器的間隔自動斷開設置的時間
                    Thread.sleep(30*1000);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

2.2 服務器重啓

有時候可能出現服務器宕機,或服務器進行維護,客戶端連接不上服務器端,即使服務器正常了,客戶端也不知道。

爲了處理這種情況,添加一個斷開自動重連機制;

自動重連機制原理:

在一個線程中,每隔一定時間,判斷如果連接斷開,就自動重新連接一次服務器。

//是否已經斷開連接
boolean isDone=true;
public class ReconnectionThread extends Thread {

        //連接計數器
        private int waiting;
    

        public void run() {
            try {
                while (isDone) {//斷開連接
                    Thread.sleep((long) waiting() * 1000L);
                    //調用連接方法
                     ...
                    waiting++;
                }
            } catch (final InterruptedException e) {

            }
        }

        private int waiting() {
            if (waiting > 20) {
                return 600;
            }
            if (waiting > 13) {
                return 300;
            }
            return waiting <= 7 ? 10 : 60;
        }
    }

注意:

 1. 重連成功isDone要設置false,要不然一直循環;

 2. 通過waiting計數重連的次數,隨着次數的增加,重連間隔時間也進行延長,防止不斷重連造成耗電;

 3. 重連成功waiting要清零:waiting=0; 

 

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