(文中部分内容来自网络)
XMPP协议:
XMPP : The Extensible Messaging andPresence Protocol.
中文全称:可扩展通讯和表示协议.
简介:可扩展通讯和表示协议 (XMPP) 可用于服务类实时通讯、表示和需求响应服务中的XML数据元流式传输。
XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。
它在促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即
使其操作系统和浏览器不同。
XMPP主要显著的优点主要有以下几个方面:
1、分布式 任何人都可以运行自己的XMPP服务器,它没有主服务器,客户端简单
2、安全性很高。使用SASL及TLS等技术的可靠安全性
3、开发性 它是开源的,易于进行学习和了解
4、跨平台 毋庸置疑,使用的XML数据格式进行传输的
Androidpn :android pushnotification(中文名称:Android消息推送)。
基于XMPP协议的java开发有一个开源框架,那就是smack,它主要封装了一些XMPP的实现。在引用smack的基础上
实现和服务器端的持久连接,以实现服务器对客户端的推送,那就是Androidpn。Androidpn在客户端集成了smack。
这样就可以很容易的简立一个和服务器端的基于xmpp协议的socket连接。所以Androidpn可以说是使用了smack框架
的开源项目。
Androidpn使用好处:
用Androidpn好处有以下方面:采用完全开放的XMPP协议进行数据传输(QQ,MSN,GTalk等都是采用的这种协议)。
良好的框架支持(专门为android而产生的推送框架smack,以及很好的管理socket的框架MINA,都是很成熟的产品);
完全开放的源代码(我们可以在Androidpn的基础上进行修改,来满足我们的任何需求变更);大大的减少了客户端的代
码,降低了android的开发难度。
Androidpn技术实现:
(这里就不说下载源码后怎么操作了,网上教程颇多)
客户端与服务器建立socket连接。
Androidpn的客户端中,进行管理连接的信息,比如XMPP的端口、IP(域名)、登录的用户名密码,以及对连接的维护(定时的
发送连接请求保持连接不失效)。整个服务器端和客户端的通信是基于一个session(会话)过程,会话开始,首先会
指定服务器的端口号,然后把信息发送到服务器端;而向服务器发送消息:<stream>根节点的方式开始传递,只有在服
务器和客户端关闭的时候才会发送它的结束标记</stream>。以客户端通过XMPP协议只用做的就是接收消息,而所有
其它的操作都交给服务器,比如管理连接、消息保存等等,这样就很大程度的减轻了客户端的负担。
Androidpn的服务器端,Androidpn主要用到的技术是Spring和Hibernate。保存用户信息到数据库并做验证,主要是用来
展示用户状态和发送信息用的。在服务器关闭的时候,发送一个</stream>标记到客户端,告知连接断开,客户端需重
新连接。管理Socket连接的时候,Androidpn采用了MINA框架来进行管理,MINA的优点就是改变了我们传统的管理socket的方式,比如每建立一个socket开一个线程,而MINA
可以实现多个线程管理N多个用户(这句不是太明白,
谁知道给留个言说下,万分感谢)。在处理高并发的推送上无疑是有巨大的好处的。
在数据传输过程中,信息处理采用XML节的方式传递信息,消息封装通常采用IQ(Info/Query)、Message(消息)、
Presence(在线状态探测)。
但是Androippn中好像没有用到Message(也许我理解错误),从Server到Client和Client到Server都用的IQ封装。
除此之外,xml的传递过程还有type可为set、get、result、error四种类型,我个人理解是:set指请求更新(改变)处理
(如从Server推送消息到client、注册用户),get指获取数据(如取好友列表),result是指请求更新后给client的应答
(如登录是否成功得告诉Client,见ClientSession中的createSession()方法),error就明显了指错误,告诉Client断开
连接。
长连接和重连:
1.客户端第一次连接服务器建立的是一个socket连接,如果服务器需要关闭返回</stream>或者一个表示ERROR的
流返回给客户端,客户端将启动定时重连线程。
2.本地连接服务器失败后将启动定时重连线程。
3.本地监听网络信息,如果网络不可用,也将启动重连线程。
4.连接成功后,监听socket连接状态,如果断开,启动重连线程。
注:1)据说防火墙可能会关闭非活动状态的连接,所以又据说建立连接后会向服务器发送心跳(keepLive)。
主要文件作用:
客户端:
DemoAppActivity程序入口Activity
ServiceManager 服务管理器,控制后台服务的启动和停止
NotificationService 初始化广播,并注册广播; 初始化线程发送开始连接广播等其它
XmppManager 定义调用asmack库的方法,做连接及其它。
ConnectivityReceiver连接广播接收者,调用XmppManager的连接方法
PersistentConnectionListener 重连监听,由asmack调用,在连接时被注册
PhoneStateChangeListener 手机连接状态监听,服务启动时被注册
NotificationIQProvider 通知消息提供者,由asmack库调用,并接收到服务器返回的消息(xml)
NotificationPacketListener 通知消息监听器,在连接后被注册,由asmack库调用,当NotificationIQProvider接收
到服务器消息后,会调用监听器的回调方法processPacket,再发送广播给NotificationReceiver
NotificationReceiver 通知广播接收者,调用Notifier中的通知方法
Notifier调用notify方法界面通知。
注:NotificationIQProvider中parseIQ()方法解析服务器发送的xml数据并封装成实体。
服务器:
org.androidpn.server.xmpp 包里面定义了一些异常类型,主要是包含有入口类XmppServer,这个类用来启动和停止server程序。
org.androidpn.server.xmpp.auth 包里面是认证的一些类,我们自己的认证模块可以在这里与androidpn进行结合。
org.androidpn.server.xmpp.codec 是XMPP协议的XML文件解析包,server收到和发送的消息都要通过这个包来进行xmpp协议编码和解码。
org.androidpn.server.xmpp.handler 包主要是对消息的处理,我们可以针对不同的消息类型定义自己的handler,可在这包在类中处理客户端发送的数据
org.androidpn.server.xmpp.net 包负责维护与client之间的持久连接,并实现了一些传输方式供发送xmpp消息时使用。
org.androidpn.server.xmpp.presence 里面只包含PresenceManager类,用来维护client的在线状态。
org.androidpn.server.xmpp.push 里面只有一个NotificationManager类包含有向client发送消息的接口,可自己封装需要的数据发送到客户端。
org.androidpn.server.xmpp.session包定义了用来表示持久链接的session,每个session包含一条连接的状态信息。用户管理所有会话,比如连接断开,删除session以及建立连接,添加session等等。
org.androidpn.server.xmpp.ssl是对连接进行ssl认证的工具包。
注: 以上红色包中,NotificationManager(org.androidpn.server.xmpp.push)带着username和message
到Session(org.androidpn.server.xmpp.session)类中找到相应的session,并封装成xml格式,再调用
Connection(org.androidpn.server.xmpp.net)中的deliver()方法给相应用户发送数据达到通信。