即时通讯里android客户端心跳机制的分析和实现

本文探讨了即时通讯(IM)中的心跳机制,解释了心跳包的作用和必要性,包括防止NAT表淘汰和Android系统进程被杀死导致的连接中断。介绍了服务器端通过SO_KEEPALIVE实现心跳以及客户端自己实现心跳的思路,并给出了客户端心跳包实现的伪代码。
摘要由CSDN通过智能技术生成

      最近项目中用到了即时通讯(IM)的模块,因此也就对即时通讯的长连接方式进行了研究,有了一点点自己的心得,所以写下了这篇博客。本篇博客是作者参考了他人的优秀博客和自己的一点点小感悟而写成的,如有理解不到位的地方,还望指正。 

     现在大多数的移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接收消息的被动权。
      什么是主动权呢?就是客户端主动向服务器请求数据的过程(例如使用http拉取数据),这个过程叫做poling(轮询).
      什么是被动权呢?就是服务器在于客户端保持长连接的情况下主动向客户端去推送数据(对应于现在流行的极光推送,或者是使用XMPP来长连接),这个过程叫做push.
      心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经离线。
      之所以会有心跳机制,原因有两点:

      什么是主动权呢?就是客户端主动向服务器请求数据的过程(例如使用http拉取数据),这个过程叫做poling(轮询).
      什么是被动权呢?就是服务器在于客户端保持长连接的情况下主动向客户端去推送数据(对应于现在流行的极光推送,或者是使用XMPP来长连接),这个过程叫做push.
      心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经离线。

      之所以会有心跳机制,原因有两点:

      第一是我们现在仍然是IPV4的方式,而IPV4的数量有限,我们手机里的Ip地址实际上是移动无线网络运营商分给我们的内网IP地址,而运营商本身就需要维护一个外网IP和端口到内网IP和端口的映射关系,所以,为了确保众多内网的手机可以跟网络服务器通讯,大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰网路地址转换表(NAT表)中的对应项,造成链路中断。

      第二是在android里,在内存不足的情况下,此时系统进程,系统服务也是会被杀死的,因此,就无法保证客户端和服务器进行一个长时间有效的长连接。   
       所以,为了让服务器获知客户端是在线还是掉线的情况,往往就需要客户端定时发送简单的信息告诉服务器,我仍然和你保持着连接。使用TCP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值