客戶端和服務器斷開連接有兩種情況: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;