IM-客户端和服务器断开重连机制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/niuba123456/article/details/90320800

客户端和服务器断开连接有两种情况: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; 

猜你喜欢

转载自blog.csdn.net/niuba123456/article/details/90320800