《Android 服务器推送技术.docx》由会员分享,可在线阅读,更多相关《Android 服务器推送技术.docx(9页珍藏版)》请在第壹文秘上搜索。
1、在开发Android和iPhone应用程序时,我们往往须要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简洁的和完备的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的探讨.在Android手机平台上,GOOgIe供应了C2DM(CloudtoDeviceMessaging)服务,起初我就是打兑采纳这个服务来实现自己手机上的推送功能.AndroidCloudtoDeviceMessaging(C2DM)是一个用来帮助开发者从熊务甥向Android应用程序发送数据的根务.该般务供应了T简洁的.轻
2、量级的机制,允许服务黑可以通知移动应用程序干盥与殿务溺进行通信以便于从皴务器获得应用程序更新和用户数据.C2DM微务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消显但是经过一番探讨发觉,这个服务存在很大的问画:1 )C2DM内音于Android的2.2系统上,无法兼容老的1.6到2.1系统;2 )C2DM须要依靠于Ggle官方供应的C2DM服务器,由于国内的网络环境,这个服务常常不行用,假如想要很好的运用,我们的AppServer必需也在国外,这个唯恐不是每个开发者都能够实现的;有了上述两个运用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文童来具体的介绍C2DM
3、的框架以及客户端和AppServer的相应设置方法,可以作为学习与参考之用.即然C2DM无去满意我们的要求那么我们就碰自己来实现Android手机客户端与APPServer之间的通信协议,保证在AppServer想向指定的Android设备发送消息时,Android设备能够刚好的收到,下面我来介绍几种常见的方案:1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必需自己实现与服务器之间的通信,例如消息排队等.而且你还要考虑轮询的频率,假如太慢可第导致某些消息的延迟,假如太快,则会大量消耗网络带宽和电池.2 )SMS:在Android平台上,你可以通过拦被SMS消息并且解
4、析消息内容来了解服务溺的意图。这是一个不错的想法,我就见过采纳这个方案的应用程序。这个方案的好处是,可以实现完全的实时操作,但是问题是这个方案的成本相对比较高,你很难找到免到的短消息发送网关,关于这个方案的实现,可以参考如下链接:.3 )f久连接这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池.Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的.不过这个方案也存在不足,就是我很难在手机上实现一个牢克的服务。Android操作系统允许在低内存状况下杀死系统服外,所以你的通知服务很可能被麋作系统K川掉了.前两个方案存在明
5、显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥!卜,以便于让该方案可以有效的工作.终归,我们要知道GMaiI.GTaIk以及GoogIeVoice都可以实现实时更新的.MQTT是f轻贵级的消息发布/订阅协议,它是实娓于手机客户迷的消息推送限若器的志向解决方案.我们可以从这早下载该项目的实例代码,并且可以找到一个采纳PHP书写的眼务器该实取架构如下所示:App1.ayerServer1.ayerReollySmallfnea9eBroker个SAfnPHPlibraryend-mqU.hWmqttJar是IBM供应的MQTT协议的实现,你可以从如下站点下载它.你可以将该jar包加入
6、你自己的Android应用程序中.ReaIIySmaIIMessageBroker(RSMB),他是一简洁的MQTT代理,同样由IBM供应.缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设氤SAM是一个针对MQTT写的PHP库.你可以从这个下载它.send.mqtt,php是一通过POST接收消息并且通过SAM格消息发送给RSMB的PHP脚本.实例码:可以从GitHub上下载实例应用.运行该应用以后,通过手机阅读器访问tokududemoandrod-push,在第一个输入框输入设备ID,在其次个输入框输入想要发送的消息内容,按下vSendPushMess
7、age按钮,你就应当可以看到手机上收到了通知了.你也可以从这个GitHub地址上下载android-push源代码,它包含了send.mqtt.php脚本.这是我在项目中采纳的方案,事实上Google正式的C2DM服务器底层也是采纳XMPP协议进行的封装.XMPP向扩展通讯和表示协议)是基于可扩展标记语言(XM1.的办议,它用于即时消息(IM)以及在线探测。这个彷议可能最终允许因特网用户向因特网上的其他任何人发送即时消息.androidp是一基于XMPP协议的java开源Androidpushnotification实SI1.它包含了完整的客户端和服务器端,经过源代码探讨我发觉,该服务器端基本
8、是在另外一个开源工程OPenfire基础上修改实现的,不过比较郁力的是androidpn的文档是由韩语写的,所以整个探讨过程基本都是读源码.它的实现示意图如下:androidpn客户端须要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于OPenfire下的另外一个开源项目smack,不过我们不须要自己编译,可以干脆杷androidpn客户端里面的asmack.jar拿来运用。客户端利用asmack中供应的XMPPConnection类与服务器建立长久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收I员务器发送的通知。androidpn服务器端也是ja
9、va语言实现的,基于openfire开源工程,不过它的Web部分采纳的是spring框架,这一点与openfire是不同的.Androidpn服务船包含两个部分,一个是侦听在5222端口上的XMPP服务负责与客户端的XMPPConneCtion类进行通信,作用是用户注册和身份认证,并发送推送通知消息.另外一部分是Web服器,采纳一个轻量级的服务器,负责接收用户的Web恳求.服务器架构如下:SessionManagerAuthManagerPresenceManagerNotificationManagerK)HandlerStanzaHandlerIQHandlerAdmmConsoleSpr
10、ingFrameworkMINAJettyJavaSE6Runtime最上层包含四个组成部分,分别是SessionManager,AuthManager,PresenceManager以及NotificationManager.SessionManager负责管理客户端与服务器之间的会话,AuthManager负责客户端用户认证管理,PresenceManager负货管理客户端用户的登录状态,NotifiCationManager负责实现照务器向客户端推送消息功能.服务器端界面如下,分别对应了上述的几个功能模块:Welcome!发送以后,我们可以在手机端看到接收的消息:这个解决方案的最大优势就是简洁,我们不须要象C2DM力瞭依靠操作系统版本,也不会担忧某一天Google服务器不行用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能.采纳这个方案,我们目前只能发送文字消息,不过对于推送来说一般足终了,因为我们不能希望通过推送得到全部的数据,一般状况下,利用推送只是告知手机端服务器发生了某些变更,当客户端收到通知以后,应当主动到服务器获得最新的数据,这样才是推送服务的完整实现