关于服务器端向Android客户端的推送,主要有三种方式:轮询,应用程序应当阶段性的与服务器进行链接并查询是否有新的消息到达,你必须本身实现与服务器之间的通讯,例如消息排队等。并且你还要考虑轮询的频率,若是太慢可能致使某些消息的延迟,若是太快,则会大量消耗网络带宽和电池;SMS(经过发送短信并解析短信内容来获取服务器端的指令),这个出现的问题是很难找到免费的网关来发送短信;最后就是持久链接,主要是Socket通信,这个解决了性能问题,可是耗电问题依旧没能解决。java
在这里,咱们主要介绍的是第三种,用持久链接的方式来进行推送。如今比较成熟的及时消息传递协议共有四种,而无疑最为主流就是XMPP协议,它是一种基于XML的传递协议,具备很强的灵活性和可扩展性。它的特色是将复杂性从客户端转移到了服务器端。在网上能够找到不少的XMPP资料,这里就不在赘述了,否则越扯越多。总之,XMPP主要显著的优势主要有如下几个方面:android
一、 分布式 任何人均可以运行本身的XMPP服务器,它没有主服务器安全
二、 安全性很高。使用SASL及TLS等技术的可靠安全性服务器
三、 开发性 它是开源的,易于进行学习和了解网络
四、 跨平台 毋庸置疑,使用的XML进行传输的session
说完优势,咱们言归正传,基于XMPP协议的java开发有一个开源框架,那就是smack,它主要封装了一些XMPP的实现。而若是把它直接用在Android上是不行的,由于android缺乏了一些java的类库,因而一个改进版的asmack诞生了,它是专门为android而改进的android smack。而另一个开源框架的诞生,则是对在引用smack的基础上实现和服务器端的持久链接,以实现服务器对客户端的推送,那就是android push notification,简称androidpn。并发
Androidpn在客户端集成了asmack。这样就能够很容易的简立一个和服务器端的基于xmpp协议的socket链接。Androidpn的客户端中,进行管理链接的类是XmppManager,它主要用来管理链接的信息,好比XMPP的端口、IP、登陆的用户名密码,以及对链接的维护。为何还有用户名和密码?这不得不提到XMPP的具体细节。整个服务器端和客户端的通讯是基于一个session(会话)过程,会话开始,首先会指定服务器的端口号,而后把上述提到的信息发送到服务器端,怎么发送消息的呢?以<stream>根节点的方式开始传递,只有在服务器和客户端关闭的时候才会发送它的结束标记</stream>。客户端经过XMPP协议只用作的就是接收消息,而全部其它的操做都交给服务器,好比管理链接、消息保存等等,这样就很大程度的减轻了客户端的负担。那么客户端和服务器端的消息回应是如何实现的?如要经过一个ID来标识,具体细节能够去查看XMPP协议。框架
一旦注册绑定后,服务器端就和客户端创建了链接,客户端只用负责去接收消息。因此当咱们应用Androidpn的时候,客户端会很是的简单。而在服务器端,Androidpn又作了什么呢?socket
服务器端的展现方面,androidpn主要用到的技术是Spring和Hibernate。主要是用来展现用户状态和发送信息用的,以下图:分布式
这方面的技术已经比较成熟,就再也不细说了,主要要说的仍是XMPP的管理。在服务器端的源码中一个org.androidpn.server.xmpp.net.Connection类,主要是表明一个服务器上的XMPP链接,注意只是一个,它能够确保在服务器关闭的时候,发送一个</stream>标记到客户端,告知链接断开,需从新链接。
org.androidpn.server.xmpp.session.SessionManager主要用户管理全部会话,好比链接断开,删除session以及创建链接,添加session等等。
而在管理Socket链接的时候,androidpn采用了MINA框架来进行管理,MINA的优势就是改变了咱们传统的管理socket的方式,好比没创建一个socket开一个线程,而MINA能够实现多个线程管理N多个用户。在处理高并发的推送上无疑是有巨大的好处的。
合理的利用监听器来管理session,也是androidpn的优势。在安全性方面,制定了TLS(安全传输层)策略,并却采用了安全认证,这些方面都作的不错。
固然,不可避免的30秒钟的心跳包仍是必不可少的。
总之,用Androidpn好处有如下方面:采用彻底开放的XMPP协议进行数据传输(QQ,MSN,GTalk等都是采用的这种协议);良好的框架支持(专门为android 而产生的推送框架asmack,以及很好的管理socket的框架MINA,都是很成熟的产品);彻底开放的源代码(咱们能够在androidpn的基础上进行修改,来知足咱们的任何需求变动);大大的减小了客户端的代码,下降了android的开发难度。缺点不言而喻,使用了太多的框架,若是想要改一些具体的实现,可能会迁移发动全身。不过若是你个懒人的话,彻底知足你的需求了。