张启华即时通讯里android客户端心跳机制的分析和实现-Android技术视界

即时通讯里android客户端心跳机制的分析和实现-Android技术视界
最近项目中用到了即时通讯(IM)的模块,因此也就对即时通讯的长连接方式进行了研究,有了一点点自己的心得,所以写下了这篇博客。本篇博客是作者参考了他人的优秀博客和自己的一点点小感悟而写成的多佛恶魔 ,如有理解不到位的地方,还望指正。
现在大多数的移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接收消息的被动权。什么是主动权呢?就是客户端主动向服务器请求数据的过程(例如使用http拉取数据)陈再见,这个过程叫做poling(轮询).什么是被动权呢?就是服务器在于客户端保持长连接的情况下主动向客户端去推送数据(对应于现在流行的极光推送,或者是使用XMPP来长连接),这个过程叫做push.心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应杨二敬,则判断对方已经离线。之所以会有心跳机制,原因有两点:
什么是主动权呢佛伊泰克 ?就是客户端主动向服务器请求数据的过程(例如使用http拉取数据),这个过程叫做poling(轮询).什么是被动权呢张启华皇甫惠静?就是服务器在于客户端保持长连接的情况下主动向客户端去推送数据(对应于现在流行的极光推送,或者是使用XMPP来长连接),这个过程叫做push.心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳沈殿霞葬礼,所以叫做心跳包邓先宇。用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包重生微醺初夏,如果在指定时间段内未收到对方响应,则判断对方已经离线丁立威。
之所以会有心跳机制单车新人王,原因有两点:
第一是我们现在仍然是IPV4的方式,而IPV4的数量有限,我们手机里的Ip地址实际上是移动无线网络运营商分给我们的内网IP地址,而运营商本身就需要维护一个外网IP和端口到内网IP和端口的映射关系,所以,为了确保众多内网的手机可以跟网络服务器通讯,大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰网路地址转换表(NAT表)中的对应项,造成链路中断萧立扬。
第二是在android里,吴必胜在内存不足的情况下,此时系统进程,系统服务也是会被杀死的,因此,就无法保证客户端和服务器进行一个长时间有效的长连接武川论坛。 所以变种鲨鱼人,为了让服务器获知客户端是在线还是掉线的情况,往往就需要客户端定时发送简单的信息告诉服务器,我仍然和你保持着连接。使用TCP的千王情人,用send发张效铭,使用UDP的,用sendto发,服务器收到后,就知道当前客户端还处于“活着”的状态,否则,如果隔一定时间未收到这样的包,则服务器认为客户端已经断开,进行相应的断开逻辑处理金钗敢死队 。先来说下server端的实现思路:如果应用是基于tcp的,可以简单地通过SO_KEEPALIVE实现心跳。TCP在设置的KeepAlive定时器到达时向对端发一个检测TCP segment,如果没收到ACK或RST,尝试几次后托奶李天王,就认为客户端已经掉线。不过,这里有个缺点,这里是server主动发出检测包,对服务器的性能有影响。现在我们来说说Client端自己实现心跳的情况:整个设计思路如下,在客户端中开启一个service,service中使用socket和服务器保持连接,同时加入心跳机制用来维持这个长连接。当service收到服务端发来的回复之后(这个回复可能来自心跳包,也可能来自正常的数据交互),以广播的形式发送给activity,告诉activity要进行相应的逻辑处理(一般是ui的变化)
以下是客户端实现心跳包的具体伪代码:



activity中的代码如下: