理解这篇文章后应该具有的能力:
一)了解androidpn体系结构
二)掌握android消息推送与接收机制【Android的收发流程】
三)按需扩展和改动androidpn
Android概述:
*androidpn是基于xmpp开源组件的一个整合方案
-->Server端:openfire ,apache mina
-->客户端:基于smack的asmack
技术基础:
-->Spring Hibernate SpringVMC
-->Socket/Thread/XML
Server代码结构说明
*dao model 和service
*util包中的类用来加载resources中的配置文件:config.xml(指定监听端口和ssl证书目录等熟悉)
*xmpp:
-->推送核心包
-->入口类XmppServer,这个类用来启动和停止Server程序
org.androidpn.server.xmpp结构说明
*auth:包含认证信息的一些类:可以扩展认证模块
*codec:是XMPP协议的XML文件解析包,server收发消息通过此处编码和解码;可扩展自定义编码/解码规则
*handler:消息的处理:可以针对不同的消息类型定义自己的handler
*net:负责维护与client之间的持久连接,并实现了一些传输方式供发送xmpp消息xmpp消息时使用。
*presence:PresenceManager类,用来维护client的在线状态。
*Push:NotificationManager类包含有想client发送消息的接口
*router:将受到的信息包发送到相应的handler进行处理。
*session:定义了用来表示持久连接的session,每个session包含一条连接的状态信息
*ssl:连接进行ssl认证的工具包
关于apache mina:在Spring-config.xml里面配置了相关内容。需要知道其用法。
其服务端:
关于客户端的作用:【本项目未用到,可以多了解下】
客户端:Client
Client这边包含消息的收发,解析以及持久连接的发起。
Notifier:客户端发送通知的类
XmppManager是控制器,NotificationService通过这个类在后台维护与服务的连接
ServiceManager:管理消息服务和加载相关的配置
android的Service和BroadCast类以及一些工具类和常量类
NotificationSettingsActivity:推送信息设置页面.
NotificationIQ,NotificationIQProvider,NotificationPacketListener三个类:消息的数据包,负责对收到的Notification格式的消息进行解析和处理
NotificationPacketListener:监听从服务器发送过来的数据包并重复执行数据包解析、发送广播、发送通知的操作。
ConnectivityReciver:处理服务端发送的推送消息
NotificationService:后台服务用语相应服务端的消息
PersistentConnectionListener:监控连接关闭和重连事件的监听
PhoneStateChangeListener:监听手机状态的事件监听类
Reconnection:重连的线程类。
服务端:
关于androidpn的asmack
*Smack:基于xmpp协议的及时通信客户端编程库
*Asmack:Smack库的Android版本 建立一个和服务器端的基于xmpp协议的socket连接
*URL:可以从网上下载
服务端和客户端的流程:【流程是非常重要的】
Android Client执行流程:【流程是非常重要的】
创建服务:
->初始化ServiceManager
-->启动服务
-->建立连接
-->用户验证
**注册用户
**用户登录
-->断开连接
-->重新连接
读取配置文件
执行流程:【流程是非常重要的】
Client<接收消息>流程【流程是非常重要的】
客户端ConnectivityReceiverReceive(建立网络连接)&通过验证&连接到服务器的前提下
1.NotificationPacketListener:
1)会一直监听从服务器发送过来的数据包Packet
2)并重复执行数据包解析:NotificationIQ-->Intent
3)发送广播(sendBroadcast给NotificationReceive)
2)NotificationReceiver:onReceiver
3)NotificationDetailsActivity:回发消息
1)封装消息:IQ
2)XMPPConnection sendPacket
Server<发送消息>流程
1.NotificationManager的push接口被调用
2.使用SessionManager在当前session集合中查找相应的client 连接
3.XMPP消息格式兵组装
4.通过相应的session,向client发送消息
SERVER<接收>消息流程
1.connection收到packet,使用org.android.server.xmpp.codec解码
2.router根据packet的namespace等信息,将packet路由到相应的handler。
3.handler进行处理:实际上只要根据client发送消息的格式,定义自己的router和handler类,然后在PacketRouter中注册router,在IQRouter中注册handler即可
androidpn问题思考
服务重启后,客户端如何重新连接
消息处理:
服务器收到消息后如何知道发给哪个
服务器端如何保存用户消息
消息如何跟踪:用户是否收到消息,用户是否读取消息
客户端离线消息如何处理
安全&用户管理
用户管理
验证与授权
信息安全
IP过滤机制,防止DDOS共计,按照频度和次数过滤
资源管理
推送平台服务
业务改进
消息封装
消息跟踪
消息管理