IM客户端消息推送的几种方式及特点

简介: 提起消息推送一般人们会经常提起的有以下几种:1.轮询顾名思义,客户端定期去向服务端询问是否有新的消息,简单点说就是服务端不关心客户端的地址是什么,客户端来询问,直接告诉它就行。这种方案最简单,但是却不适用于即时通讯产品,因为即时通讯软件的消息传递机制与一般的消息推送的区别就在即时这点,如果采用轮询的方式,客户端每几秒就连一次服务器,对于手机电量与流量的消耗是很大的。

提起消息推送一般人们会经常提起的有以下几种:
1.轮询
顾名思义,客户端定期去向服务端询问是否有新的消息,简单点说就是服务端不关心客户端的地址是什么,客户端来询问,直接告诉它就行。这种方案最简单,但是却不适用于即时通讯产品,因为即时通讯软件的消息传递机制与一般的消息推送的区别就在即时这点,如果采用轮询的方式,客户端每几秒就连一次服务器,对于手机电量与流量的消耗是很大的。
2.XMPP
XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。它的系统结构如下图所示:
1

但是它也有两个致命的缺点:随着通常超过70%的XMPP协议的服务器的数据流量的存在和近60%的被重复转发,XMPP协议目前拥有一个大型架空中存在的数据提供给多个收件人。新的议定书正在研究,以减轻这一问题。它的另一个缺点是由于XMPP协议的方式被编码为一个单一的长的XML文件,因此无法提供修改二进制数据。

3.MQTT
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。它的PUSH结构示意图如下图所示:
2

MQTT由于开放源代码,耗电量小等特点,在物联网领域,传感器与服务器的通信,信息的收集,MQTT都是不错的方案。在手机移动端的消息推送也是备选的方案之一。但是它的设计初衷是为:大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的。而且他的实现比较复杂,服务端组件rsmb不开源,所以MQTT更适合于物联网端的通信。

4.长连接
所谓长连接指建立SOCKET连接后不管是否使用都保持连接。当然有人会问长连接定时发送心跳,这和轮询有什么区别?手机休眠状态下连接会不会断掉等。
在这之前先来了解一下一些相关的概念。心跳包的作用:有人可能会觉得心跳包是用来通知服务端,客户端当前的状态。这种说法固然没错,但是本质是心跳包的主要作用是防止NAT超时,其次是检查连接是否断开。NAT是为了解决IP数量不足的问题而做的一种网络地址的转换。简单讲就是运营商的网关需要维护一个外网IP与内网IP及端口之间的一种映射关系。当前的移动网络运营商在一定时间段内数据链路没有数据通讯时,会更新NAT表中的映射关系,造成链路中断。具体的NAT穿越等细节不在此讨论。
所以,可以粗略的认为心跳包的一个作用就是为了解决NAT中断的问题。但是心跳包发送的间隔时间必须要小于NAT超时的时间,这样才能保证链路的不中断。
下面简单阐述一下心跳包与轮询的区别,以此来说明长连接方案比轮询方案的优势。轮询与心跳本质的不同是轮询的目的是为了从服务端得到数据,而心跳是为了保持连接。而且轮询比心跳更耗电,轮询要经过TCP的三次握手,但是单次心跳缺不需要这样。
最后一个问题,手机休眠状态下连接是否会断掉。这个问题如果详细讨论的话比较复杂,涉及手机AP,BP处理器的处理策略,简单点说就是TCP数据包能够唤醒手机。因此长连接是比较适合手机移动端的即时通讯的。

目录
相关文章
|
4月前
|
数据采集 监控 测试技术
大型IM稳定性监测实践:手Q客户端性能防劣化系统的建设之路
本文以iOS端为例,详细分享了手 Q 客户端性能防劣化系统从0到1的构建之路,相信对业界和IM开发者们都有较高的借鉴意义。
146 2
|
移动开发 JavaScript 小程序
IM客户端架构设计
一些关于IM客户端架构的总结
319 0
|
存储 缓存 自然语言处理
揭秘百度IM消息中台的全量用户消息推送技术改造实践
本文介绍了百度现有IM消息中台系统的主要组成,并对比多种实现方案的优劣,以“公有信箱”通知读扩散的技术方案对现有IM消息中台系统进行改造,从而达成了低成本、高时效地实现全量用户通知推送需求。
281 0
|
Web App开发 JavaScript 算法
开源轻量级 IM 框架 MobileIMSDK 的Uniapp客户端库已发布
开源轻量级 IM 框架 MobileIMSDK 的Uniapp客户端库已发布
254 0
|
存储 移动开发 JavaScript
IM开发干货分享:IM客户端不同版本兼容运行的技术思路和实践总结
本文将基于笔者的IM产品开发和运营实践,为你分享如何实现不同APP客户端版本与服务端通信的兼容性处理方案。
232 0
|
存储 网络协议 JavaScript
IM跨平台技术学习(四):蘑菇街基于Electron开发IM客户端的技术实践
本篇将回到IM即时通讯技术本身,根据蘑菇街的实际技术实践,总结和分享基于Electron开发跨平台IM客户端的过程中,需要考虑的典型技术问题以及我们的解决方案。希望能给你带来帮助。
402 0
IM跨平台技术学习(四):蘑菇街基于Electron开发IM客户端的技术实践
|
Web App开发 安全 网络协议
从客户端的角度来谈谈移动端IM的消息可靠性和送达机制
1、前言 IM App 是我做过 App 类型里复杂度最高的一类,里面可供深究探讨的技术难点非常之多。这篇文章和大家聊下从移动端客户端的角度所关注的IM消息可靠性和送达机制(因为我个人对移动客户端的经验积累的比较丰富嘛)。
3594 0
|
缓存 自然语言处理 网络协议
IM 客户端技术演进路线(下)
IM 客户端技术演进路线(下)
258 0
IM 客户端技术演进路线(下)
|
存储 消息中间件 缓存
IM 客户端技术演进路线(上)
IM 客户端技术演进路线(上)
674 0
IM 客户端技术演进路线(上)
|
JSON 缓存 安全
开源IM项目OpenIM发布消息推送api,支持应用与IM互通深度融合
开源IM项目OpenIM发布消息推送api,支持应用与IM互通深度融合
1652 0
开源IM项目OpenIM发布消息推送api,支持应用与IM互通深度融合