【整理】解刨 AndroidPN 消息推送
声明:资源来源于网络,感谢各位原作者。
整理/arjinmc
通信机制
Androidpn 是韩国 Sehwan No 写的开源消息推送项目,很多大公司都用这个消息推送方
式构建自己的消息推送服务,缺点是导致客户端比较耗电。通信机制分别由客户端和服务器
完成。
客户端采用基于java 的 XMPP 协议包 asmack(该包依赖于 openfire 下的开源项目 smack)。
通过该协议包提供的 XMPPConnetcion 类与服务器建立持久连接,并通过该连接进行用户注
册和登录认证,以及接受服务器消息。
服务器是基于开源的 openfire 工程,采用 java 语言实现和 Spring 框架提供 Web 服务。
主要有两个部分,一个是侦听在 5222 端口上的 XMPP 服务,负责与客户端的 XMPPConnection
类进行通信,作用是用户注册和身份认证,并推送消息。另外是 Web 服务器,采用一个轻
量级的 HTTP 服务器,负责接收用户的 Web 请求。
整个基于 XMPP 的通信中,服务器端和客户端的通信是基于一个 session(会话)过程,
会话开始,首先客户端会指定端口号,然后把准备的连接信息发送到服务器端,客户端通过
XMPP 协议做的只有接收消息,其他的管理连接和保存消息等都由服务器负责。消息的传递
是以根节点<stream>为起始,以</stream>为结束。
服务器和客户端建立 Tcp 连接过程如下。首先,建立会话协商,Client 准备 connecting to
server (127.0.0.1:5222)。其次,服务器询问 Client 所支持的安全认证。再者,Client 发送给服
务器要注册的用户。然后,Client 根据服务器的要求提交用户信息。最后,Client 关闭注册
的 STREAM 元素。
服务器
服务端架构依赖 spring、mina 框架,spring 完成 java Ben 管理,mina 完成网络通信。另
外,服务端还通过 jetty 潜入了 Admin Console Web 界面功能。对于 spring 的依赖导致要把
androidpn-server 整合潜入项目中时,要考虑和自己项目本身 spring 环境的整合问题,可能
要改造 androidpn-server 源代码,具体要看项目中 spring 的环境。对于 mina 的依赖不存在
这个问题,因为 mina 是类库型框架,而 spring 是容器型框架。androidpn-server 对 jetty 的
使用不是可选的,而是和 jetty 绑定的,所以要不使用 jetty 就必须对 androidpn-server 的源
代码进行改造。
另外,对数据的存储使用 hibernate 框架,androidpn-server 在使用 hibernate 时配置通
过 ehcache 实现二级缓存。官方默认使用的数据库是 HSQLDB 数据库,你可以改用其他数
据库。HSQLDB 是用 java 语言实现的数据库,对其使用请自己学习。Androidpn-server