版权声明:原创文章,未经博主同意禁止转载。欢迎点击头像上方“郭晓东的专栏”查看专栏 https://blog.csdn.net/hherima/article/details/27184417

----------------------------------------------------欢迎查看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心跳

        IM主要的底层逻辑中有“心跳”概念。即client定时向Server发一个信令包,表示client还“活”着。注意。是client发起的。心跳是一个拟人的比喻,跟人的心跳类似。那么心跳终止了会发生什么事情呢?分为两种情况:Server主动断开socket,client主动断开socket。
1. Server主动断开socket
Server仅仅是接收client发起的心跳。

假如,Server长时间没有收到client的心跳,Server觉得client已经“死了”,主动断开这个连接。

此时client可能就是假在线(点击打开原文)了。

2. client断开socket
client对待心跳。要比Server麻烦一些。client要关注两个值:
● 心跳间隔值,即client多长时间发一次心跳?
● 心跳的超时时间。client发送一次心跳,假设长时间得不到Server应答,代表网络糟糕。client须要断开socket,主动离线。

非常明显。第二点就是client主动断开的情况,普通情况下,超时时间为60秒。
网上也有争论:究竟是否须要心跳,微信是没有心跳的,qq和飞信有心跳。
也有专家说心跳包已经影响到移动网络,由于心跳是定时频繁发送。

心跳失败也会引起断线重连

以下是“心跳失败”引起的断线重连的流程图

浅谈IM软件client的断线重连、心跳和长在线的更多相关文章

  1. 浅谈IM软件怎样建立安全socket连接、登录

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

  2. 浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥

    概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的.RSA就是取自他们三个人的名字. 算法基于一个数论:将两个大素数相乘很ea ...

  3. 浅谈大型web系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

  4. Netty(六):Netty中的连接管理(心跳机制和定时断线重连)

    何为心跳 顾名思义, 所谓心跳, 即在TCP长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, 有可 ...

  5. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...

  6. 浅谈OA办公软件市场行情

    3.原文:http://www.jiusi.net/detail/472__776__3999__1.html 关键词:oa系统,OA办公软件 浅谈OA办公软件市场行情 中国的OA办公软件市场历经20 ...

  7. 发现电脑上装着liteide,就用golang做一个TCP通讯测试(支持先启动client端和断线重连)

    1.参考https://www.cnblogs.com/yin5th/p/9274495.html server端 main.go package main import ( "fmt&qu ...

  8. Python 浅谈编程规范和软件开发目录规范的重要性

    最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每个字符都要咨询他,用老师的话来说,这就是命名不规范的后续反应.所以此时的我意识到写一篇关于注释程序的重要 ...

  9. 前端性能优化--为什么DOM操作慢? 浅谈DOM的操作以及性能优化问题-重绘重排 为什么要减少DOM操作 为什么要减少操作DOM

    前端性能优化--为什么DOM操作慢?   作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩( ...

随机推荐

  1. 5. RAMN备份与恢复

    一. rman简介 RMAN(Recovery Manager)是一种用于备份(backup).还原(restore)和恢复(recover)数据库的 Oracle 工具.RMAN只能用于ORACLE ...

  2. 【代码审计】五指CMS_v4.1.0 copyfrom.php 页面存在SQL注入漏洞分析

      0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...

  3. libgl1-mesa-glx:i386 : 依赖: libglapi-mesa:i386

    libgl1-mesa-glx:i386 : 依赖: libglapi-mesa:i386 1.获取Android源代码 Android官网给出了从网上下载源代码的方法,具体流程如下网址所示:http ...

  4. js中的try/catch

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Python2.7字符编码详解

    目录 Python2.7字符编码详解 声明 一. 字符编码基础 1.1 抽象字符清单(ACR) 1.2 已编码字符集(CCS) 1.3 字符编码格式(CEF) 1.3.1 ASCII(初创) 1.3. ...

  6. C#日志记录设计与实现(BenXHLog)

    C#日志记录设计与实现 日志记录: 日志记录在程序设计开发过程中,是非常重要的,可以供调试和记录数据,虽然说有开源的强大日志管理系统,比如apache的Log4Net,功能可谓强悍,但是有时候,不需要 ...

  7. day_5.11 py main

    ''' 2018-5-11 18:52:19 模块其实就是Java中的包 模块 就是 xxx.py main.py默认是最主要的模块 ''' class ClasssName(object): pas ...

  8. nodejs yarn包管理工具

    Yarn https://yarnpkg.com/zh-Hans/docs/install#windows-stable 安装包 Yarn Npm yarn npm i yarn global add ...

  9. 3、CSS属性组成和作用

    3:CSS属性组成和作用 学习目标 1.css属性和属性值的定义 2.css文本属性 3.css列表属性 4.css背景属性 5.css边框属性 6.css浮动属性 一.css属性和属性值的定义 属性 ...

  10. [No0000169]Potplayer倍速播放快捷键修改速率步长

    右键-播放-播放设置-速度调整单位改成0.5,即可一次加速到1.5