Android的消息推送系列之消息推送原理

来源:互联网 发布:windows找不到chrome 编辑:程序博客网 时间:2024/05/29 03:18

今天下午看了《见证Android消息推送时刻》,决定按照视频所讲演示一遍,作为笔记,一方面供自己翻看查阅,另一方面供大家学习交流。

参考文档:

     Android消息推送

         Android推送通知指南

定义:消息推送即服务器定向向客户端实时播发信息的功能;

1、Android消息推送机制

Android手机平台上,Google提供了C2DMCloudto Device Messaging)服务,Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。

      而这个服务存在很大的问题:

1C2DM内置于Android2.2系统上,无法兼容老的1.62.1系统;

2C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;

      既然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:

1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。(个人理解:轮询是短连接的实现方式,用http协议,应用程序定时或以一定的频率向服务器请求消息,要达到实时通讯,则需高频率request,所以会消耗很多流量等资源

2SMS:在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,主要依赖电信运营商,关于这个方案的实现,可以参考如下链接:https://labs.ericsson.com/apis/mobile-java-push/。(Short Message Service 短信服务,目前移动将把短信业务以流量形式计费,以SMS形式去实现可能会有发展

3)持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。(长连接,通常用Socket来实现,客户端与服务器间始终建立一个通信连接,没有中断之前,客户端和服务器端可实时通信;Socket可即时通信(IMInstant Message

      建立在TCP协议之上的XMPP协议,不仅可提供可这种持久连接的功能,能实现服务器和客户机的双工通信,还能不依赖与系统版本和google服务器的限制,提供了比较好的解决方案。

2、采用XMPP协议实现Android推送

XMPP全称Extensible Messaging and PresenceProtocol,前身是Jabber项目,是一种以XML为基础的开放式即时通讯协议。XMPP因为被Google Talk和网易泡泡应用而被广大网民所接触。XMPP的关键特色是,分散式的即时通讯系统,以及使用XML串流。XMPP目前被IETF国际标准组织完成了标准化工作。

Android push notification,androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。该服务器端基本是在另外一个开源工程openfire基础上修改实现的。

androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。


androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,

      一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。

      另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器的这两方式,意义非凡:当相应的TCP端口被防火墙封闭,可以使用轮询的方式进行访问,因此又有助于通过防火墙。


 

         最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。

(其实这里的androidpn也是一种第三方管理的服务器,省去了大家编写socket和搭建一个完整消息推送平台的麻烦,毕竟一个好的消息推送系统要考虑服务器并发量、与客户端的区分连接、客户端断线重连等。)


0 0
原创粉丝点击