----------------------------------------------------欢迎查看IM软件业务知识《专栏》-------------------------------------------------------------------
使用状态机来保持在线状态 【点击】 拼图算法,将零碎小图,整理到一张大图上【点击】
登录导航 【点击】 会话session的概念【点击】
“假在线’ 【点击】 非对称加密。RSA算法【点击】
怎样建立安全socket连接、登录 【点击】 浅谈断线重连、心跳和长在线 【点击】
iOS client创建网络连接,常见错误汇总 【点击】 protocolBuf 在iOS上的使用入门、解说、指南 【点击】
实现富文本解析【点击】 UITableview Deceleration 加速滑动(惯性滑动)、弹性回归原理【点击】
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
概述
本人也有个几年IM开发经验。对一些IM软件的一些特性有一些总结,跟过业务查看 IM软件业务知识
市面IM软件都有一个基础功能就是长在线(TCP长连接)。即仅仅要有网络就保持登录,然而,网络状态是无法预測的,所以IM软件常常会有”离线“状态,,尤其是手机client。
保持IM处于长在线,则依赖断线重连来完毕。
通常来说。网络不稳定是造成不能长时间在线的主要原因。另外还有:server强制注销client、次client被主client踢。
眼下的qq和飞信都有断线重连机制。
有时候IM软件自己主动完毕登录。有时候须要用户手动登录。
所以。断线重连是一个广泛的概念。
能够这么理解:除了从APP登录界面进去的登录。其它都能够称之为断线重连(甚至。把APP杀死。又一次启动也是断线重连的一种)
断线重连的定义
使得IM软件能够长在线。或者短时间内掉线,最好能够做到用户无感知。
广义断线重连:用户已经成功登录IMclient,用户将程序放到后台、或者手机重新启动。IM软件再次进入前台,软件可帮助用户实现自己主动登录。
狭义的断线重:client的网络状况是不可预知的。可能从2G切换到3G或者WiFi,或者又切换到2G,甚至“飞行模式”(iOS设备)。client要及时对网络的变化做出反应。即尝试进行登录。
【总之】断线重连,通常是网络原因引起的,目的是让IM软件维持在线的状态。
实现方法
IMclient始终尽可能的保持连接跟server的连接,client维护已登录状态,以便断线重连。从逻辑层次上来说,断线重连的逻辑是基于登录的逻辑的,首次登录成功后,都有可能有断线重连(以iOS平台为例)断线重连,实质上分为两步:一、使client断线;二、让client重连server。一般来说这两步是一个有前后顺序。完整的过程。
一、使client断线,即让client处于“未连接”状态。以下情况将触发这个事件:
1.网络切换,如从WiFi切换到4G。网络事件。
2.网络连接失败、网络不可用。
3.心跳失败、心跳超时,失败统称心跳失败。
4.IM软件后台执行即将结束。
二、让client重连server,client依据以下几种情况实现重连server。1.iOS系统“网络可用”的通知
2.IM软件切换到前台,用户触发事件。
3.网络切换。如从WiFi切换到4G,网络事件。
4.心跳失败的事件。
5.client又一次启动事件。
断线重连的场景能够总结为以下几个:
1. 又一次启动(自己主动登录)属于广义的断线重连。须要提前载入用户缓存。保证用户到达主界面后能看到历史信息。
2. 网络错误,网络切换
网络连接失败有非常多种,不同的场景,client要使用不同的逻辑处理。
3. 心跳失败
心跳超时,失败统称心跳失败。
这个案例说明当前client——server连接已经损坏。或者当前用户身份有变化。心跳失败后首先将client离线,然后进行断线重连操作,避免心跳失败和网络错误事件一并发生,造成两次登录。
4. 网络可达或者切换到前台
为了避免反复登录。当IM软件处于“登录成功”、“连接中”或者“已注销”的几个状态的时候,client忽略“网络可达或者切换到前台”的事件。
client心跳
假如,Server长时间没有收到client的心跳,Server觉得client已经“死了”,主动断开这个连接。
此时client可能就是假在线(点击打开原文)了。
心跳失败也会引起断线重连
以下是“心跳失败”引起的断线重连的流程图