概述

目前IM软件有一个基本的功能就是长在线,即只要有网络就保持登录,然而,网络状态是无法预测的,所以IM软件经常会有”离线“状态,尤其是手机客户端。长在线这个功能依赖断线重连完成。

通常,网络不稳定是造成不能长时间在线的主要原因,还有比如:服务器强制注销客户端、次客户端被主客户端踢。目前的qq和飞信都有断线重连机制。有时候IM软件自动完成登录,有时候需要用户手动登录。所以,断线重连是一个广泛的概念。可以这么理解:除了从登录界面进去的登录,都可以称之为断线重连。

断线重连的定义

使得IM软件能够长在线,或者短时间内掉线,用户无感知。

广义断线重连:用户已经成功登录IM客户端,用户将程序放到后台、或者手机重启,IM软件再次进入前台,软件应帮助用户实现自动登录。

狭义的断线重:客户端的网络状况是不可预知的,可能从2G切换到3G或者WiFi,或者又切换到2G,甚至“飞行模式”(iOS设备)。客户端要及时对网络的变化做出反应,即尝试进行登录。

总之:断线重连,一般是网络原因引起的,目的是让IM软件维持在线。

实现方法

IM客户端始终尽可能的保持连接跟服务器的连接,客户端维护登录状态,以便断线重连。从逻辑层次上来说,断线重连的逻辑是基于登录的逻辑的,首次登录成功后,都有可能有断线重连。断线重连,实质上分为两步:一、使客户端断线;二、让客户端重连服务器。一般来说这两步是一个有前后顺序,完整的过程。

一、使客户端断线,即让客户端处于“未连接”状态。以下情况将触发这个事件:

1.网络切换,如从WiFi切换到4G,网络事件。

2.网络连接失败、网络不可用。

3.心跳失败、心跳超时,失败统称心跳失败。

4.IM软件后台运行即将结束。

二、让客户端重连服务器,客户端根据以下几种情况实现重连服务器。

1.iOS系统“网络可用”的通知

2.IM软件切换到前台,用户触发事件。

3.网络切换,如从WiFi切换到4G,网络事件。

4.心跳失败的事件。

5.客户端重新启动事件。

断线重连的场景可以总结为下面几个:

1. 重新启动(自动登录)

属于广义的断线重连,需要提前加载用户缓存,保证用户到达主界面后能看到历史信息。

2. 网络错误,网络切换

网络连接失败有很多种,不同的场景,客户端要使用不同的逻辑处理。

3. 心跳失败

心跳超时,失败统称心跳失败。这个案例说明当前客户端——服务器连接已经损坏,或者当前用户身份有变化。心跳失败后首先将客户端离线,然后进行断线重连操作,避免心跳失败和网络错误事件一并发生,造成两次登录。

4. 网络可达或者切换到前台

为了避免重复登录,当IM软件处于“登录成功”、“连接中”或者“已注销”的几个状态的时候,客户端忽略“网络可达或者切换到前台”的事件。

客户端心跳

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

1. Server主动断开socket

Server只是接收客户端发起的心跳。假如,Server长时间没有收到客户端的心跳,Server认为客户端已经“死了”,主动断开这个连接。此时客户端可能就是假在线了。

2. 客户端断开socket

客户端对待心跳,要比Server麻烦一些。客户端要关注两个值:

心跳间隔值,即客户端多长时间发一次心跳?

心跳的超时时间。客户端发送一次心跳,如果长时间得不到Server应答,代表网络糟糕。客户端需要断开socket,主动离线。

很明显,第二点就是客户端主动断开的情况,一般情况下,超时时间为60秒。
网上也有争论:到底是否需要心跳,微信是没有心跳的,qq和飞信有心跳。也有专家说心跳包已经影响到移动网络,因为心跳是定时频繁发送。

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

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

信令风暴

互联网应用的心跳包除了宣告终端在线外,还有一项重要的任务,就是提供终端的即时地址,方便应用服务器的寻址。         有了互联网应用的心跳机制,应用服务器可以及时下发(Push)用户相关的信息,比如微信中的短消息、图片或者语音等。心跳包也会带来很多副作用,比如终端更为费电,还可能给移动通信网络带来信令风暴。

看起来很完美的心跳机制,为什么会给移动网络带来信令风暴呢?原来,移动通信网络中由于用户众多、资源稀缺,每个用户都是动态占用资源,比如IP地址以及无线信道。每次发送心跳包,都需要移动通信网络为用户分配资源,分配的过程体现在信令的发送和接收上。一次心跳包的发送过程,牵涉的信令多达几十条。 随着互联网APP的普及,大量的终端周期性地发送心跳包,效果类似于IP网络中的DDOS,必然对移动通信网络设备带来冲击,造成拥塞等情况,这种现 象就是信令风暴。

https://blog.csdn.net/kobejayandy/article/details/46701251

互联网的长在线、心跳和断线重连相关推荐

  1. 长连接、心跳和断线重连

    长连接.心跳和断线重连 2017年06月22日 18:38:53 天涯遍地是小草 阅读数 7938 一.概述 目前IM软件有一个基本的功能就是长在线,即只要有网络就保持登录,然而,网络状态是无法预测的 ...

  2. 长连接 、短连接、心跳机制与断线重连

    在不同场景下要考虑长连接还是短连接,那么我们要先了解他. 短连接 概念 client与server通过三次握手建立连接,client发送请求消息,server返回响应,一次连接就完成了. 这时候双方任 ...

  3. 浅谈IM软件客户端的断线重连、心跳和长在线

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

  4. Android 通过 NSD 服务 Netty(断线重连、心跳、黏包处理) 实现两个 Android 系统端的长连接通讯

    引言 近期需求,通过手机App端取号机(含叫号通知功能),实时连接 另一台 Android 广告机用于播放当前被叫到的号数. 这里有两种Android 机 一台「基于Sunmi版的可出小票的Andro ...

  5. android 心跳 简书,Android Socket保持心跳长连接,断线重连

    昨天三点钟才睡觉的,现在胸口感觉闷闷的,兄弟们,我是不是要GG了?如果我G了,求大佬们给我烧个女朋友, ss.gif 1.在使用Socket连接客户端和服务器端的时候,如果服务端断开了连接,我们客户端 ...

  6. 面试官问:服务的心跳机制与断线重连,Netty底层是怎么实现的?懵了

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, ...

  7. Netty实现心跳机制与断线重连

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:https://www.jianshu.com/p/ ...

  8. 浅析 Netty 实现心跳机制与断线重连

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

  9. 四、Netty 实现心跳机制与断线重连

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

  10. 用Netty撸一个心跳机制和断线重连!

    来源:www.jianshu.com/p/1a28e48edd92 心跳机制 何为心跳 所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确 ...

最新文章

  1. 服务器邮箱备份文件在哪里,如何轻松将数据文件备份到电子邮箱?
  2. Git突破文件限制上传大文件
  3. 计算机网络实验仿真系统设计,计算机网络实验课程仿真系统平台的研究与设计...
  4. 【Java】BigDecimal
  5. 密码学专题 文本数据库
  6. CSS3最颠覆性的动画效果,基本属性[3D]
  7. web流程设计器 工作流的 整合视频教程 activiti画图 SSM和独立部署
  8. 调试一个Ext打开的window窗口内嵌Iframe的form提交问题
  9. @Scheduled定时任务
  10. matlab编写全置信度函数,Matlab_curve_fitting_tool的用法图文结合
  11. 什么是银行行号,银行联行号有哪些功能?
  12. smith圆图重要性_smith圆图的理解
  13. 报错:Unhandled exception
  14. java的round函数怎么用_Java Math round()用法及代码示例
  15. 深度学习|迁移学习|强化学习
  16. 蒲公英 · JELLY技术周刊 Vol.29: 前端智能化在阿里的那些事
  17. 玩转华为数据中心交换机系列 | 配置基于MAC地址划分VLAN示例
  18. 路由器怎么知道外网返回的数据包发给局域网中哪台主机呢?
  19. Windows重定向技术【文件重定向与注册表重定向】
  20. python实现抽签功能(不放回抽样)

热门文章

  1. 16位伪指令汇编程序查看内存
  2. 求n!的位数以及求n!具体的值(C or C++)
  3. 二维向量vector初始化问题(以统计字符串字母题为例)
  4. excel 使用排序工具实现每隔一行加一行空行
  5. 实习踩坑之路:使用@Value注解导致Parse attempt failed for value [08:00],时间转换出错?
  6. Flutter实战之Builder和StatefulBuilder
  7. Netflix:如何打造开放协作的实时 ETL 平台?
  8. 面试官:问点基础,说说Object类下面有几种方法呢?
  9. 基于 MVP+RxJava2+Retrofit2 的应用—熊猫眼
  10. mysql 分表查询外连接_SQL多表连接查询实例(内连接外连接)