最近项目中用到了即时通讯(IM)的模块,因此也就对即时通讯的长连接方式进行了研究,有了一点点自己的心得,所以写下了这篇博客。本篇博客是作者参考了他人的优秀博客和自己的一点点小感悟而写成的,如有理解不到位的地方,还望指正。
现在大多数的移动端应用都有实时得到消息的能力,简单来说,有发送消息的主动权和接收消息的被动权。
什么是主动权呢?就是客户端主动向服务器请求数据的过程(例如使用http拉取数据),这个过程叫做poling(轮询).
什么是被动权呢?就是服务器在于客户端保持长连接的情况下主动向客户端去推送数据(对应于现在流行的极光推送,或者是使用XMPP来长连接),这个过程叫做push.
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经离线。
之所以会有心跳机制,原因有两点:
什么是被动权呢?就是服务器在于客户端保持长连接的情况下主动向客户端去推送数据(对应于现在流行的极光推送,或者是使用XMPP来长连接),这个过程叫做push.
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。用来判断对方(设备,进程或其它网元)是否正常运行,采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经离线。
之所以会有心跳机制,原因有两点:
第一是我们现在仍然是IPV4的方式,而IPV4的数量有限,我们手机里的Ip地址实际上是移动无线网络运营商分给我们的内网IP地址,而运营商本身就需要维护一个外网IP和端口到内网IP和端口的映射关系,所以,为了确保众多内网的手机可以跟网络服务器通讯,大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰网路地址转换表(NAT表)中的对应项,造成链路中断。
第二是在android里,在内存不足的情况下,此时系统进程,系统服务也是会被杀死的,因此,就无法保证客户端和服务器进行一个长时间有效的长连接。
所以,为了让服务器获知客户端是在线还是掉线的情况,往往就需要客户端定时发送简单的信息告诉服务器,我仍然和你保持着连接。使用TCP