专业IM即时通讯软件开发,值得信赖!

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

即时通讯软件开发 云聊IM 101℃

本文转自:https://www.jianshu.com/p/6ccee6942f20

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

喜欢 (6)
仿微信聊天软件开发
点击这里给我发消息