(文中部分内容来自网络,如无意中侵犯了版权,请告之!)

XMPP协议:
XMPP : The Extensible Messaging andPresence Protocol.
中文全称:可扩展通讯和表示协议.
简介:可扩展通讯和表示协议 (XMPP) 可用于服务类实时通讯、表示和需求响应服务中的XML数据元流式传输。
XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。
它在促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。
XMPP主要显著的优点主要有以下几个方面:
1、分布式  任何人都可以运行自己的XMPP服务器,它没有主服务器,客户端简单
2、安全性很高。使用SASL及TLS等技术的可靠安全性
3、开发性 它是开源的,易于进行学习和了解
4、跨平台  毋庸置疑,使用的XML数据格式进行传输的

Androidpn:
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技术实现:

androidpn配置:
1.启动服务器 androidpn-server-0.5.0\bin\run.bat
由于服务器端是使用Jetty做为web容器,所以默认的访问路径是http://127.0.0.1:7070/indexuser.do 。
2.将androidpn-client-0.5.0.zip 解压后导入Android工程项目,将androidpn-client-0.5.0\res\raw\androidpn.properties 的xmppHost=192.168.**.** 修改为你自己的服务器端IP,然后生成APK安装包。当服务器端检测到你的客户端以后,你就可以向该手机发送通知了。

客户端与服务器建立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)。

主要文件作用:
(1)、 客户端:
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数据并封装成实体。

(2)、服务器:
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()方法给相应用户发送数据达到通信。

示例代码下载链接:http://download.csdn.net/detail/klcf0220/6806851

官网源码下载链接:http://sourceforge.net/projects/androidpn/files/

参考链接:http://blog.csdn.net/sgz_china/article/details/8722626

androidpn 推送系统的更多相关文章

  1. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  2. MPush开源消息推送系统:简洁、安全、支持集群

    引言由于之前自己团队需要一个消息推送系统来替换JPUSH,一直找了很久基本没有真正可用的开源系统所有就直接造了个轮子,造轮子的时候就奔着开源做打算的,只是后来创业项目失败一直没时间整理这一套代码,最近 ...

  3. 开源实时消息推送系统 MPush

    系统介绍 mpush,是一款开源的实时消息推送系统,采用java语言开发,服务端采用模块化设计,具有协议简洁,传输安全,接口流畅,实时高效,扩展性强,可配置化,部署方便,监控完善等特点.同时也是少有的 ...

  4. AndroidPn推送测试

    服务器搭建好了之后,往客户端推送.按照里面自带的一个client,可以分别在模拟器和真机上分别测试,不过由于这个框架真的不是很完善,会遇到各种问题. (1) 其中还遇到了一个安卓模拟器的问题,启动模拟 ...

  5. laravel整合workerman做消息推送系统

    官方建议分离 workerman和mvc框架的结合,我去,这不是有点脑缺氧吗? 大量的业务逻辑,去独立增加方法和类库在写一次,实际业务中是不现实和不实际的 gateway增加一些这方面的工作,但是我看 ...

  6. 微博Rss邮箱推送系统

    微博Rss邮箱推送

  7. php实现简单消息发送+极光推送系统

    前几天刚写完的一个东西,写的比较简单,没有使用其他插件,原生php+计划任务实现 极光推送的代码 /* $receiver="registration_id" : [ " ...

  8. .net core 3.0 Signalr - 实现一个业务推送系统

    ## 介绍 ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实时 Web 功能使服务器端代码能够即时将内容推送到客户端. SignalR 的适 ...

  9. Android推送方案分析(MQTT/XMPP/GCM)

    本文主旨在于,对目前Android平台上最主流的几种消息推送方案进行分析和对比,比较客观地反映出这些推送方案的优缺点,帮助大家选择最合适的实施方案. 方案1. 使用GCM服务(Google Cloud ...

随机推荐

  1. C# HasRows 和 Read的区别

    HasRows:返回true或者false,表示从数据库中读取出来的数据集DataRead是否存在,用来判断是否为空: Read:返回true或者false,Read才是真正的读数据,采用的是顺序读法 ...

  2. 如何写一份优秀的java程序员简历

    背景:进入第一家公司已经工作将近两年了,其中闲了一年,在准备自己的简历的时候,有种江郎才尽的感觉,不知道怎么写,看来平时还是要多积累多熟悉. ps:这里面的分享看完还是很受用的. 简历看得比较认真的, ...

  3. Servlet学习:(三)Servlet3.0 上传文件

    转: Servlet学习:(三)Servlet3.0 上传文件 2018年08月03日 11:57:58 iDark_CSDN 阅读数:362   一.注意事项 客户端(浏览器) 表单的提交方法必须是 ...

  4. layui 批量上传文件 + 后台 用servlet3.0接收【我】

    前台代码: [主要参照layui官方 文件上传示例 https://www.layui.com/demo/upload.html] <!DOCTYPE html> <html> ...

  5. CSS3:文字属性

    文字属性注意的细节: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  6. Java项目怎么使用Swagger生成API文档?

    一.环境1. JAVA82. MAVEN 3.0.53. IDEA 2016.2.54. spring boot 1.4.1 <dependency> <groupId>io. ...

  7. js格式化日期工具类

    就是一个工具类  开箱即用 传进一个指定的参数,格式化 //将时间戳格式化 function getMyDate(time){ if(typeof(time)=="undefined&quo ...

  8. Array map()方法

    这里的map不是“地图”的意思,而是“映射”.“映射”就是原数组被“映射”成对应新数组. [].map()基本用法跟forEach类似. map()方法返回一个新数组,数组中的元素为原始数组元素调用函 ...

  9. go for range

    func main() { var str = "hellow worda" for _, val := range str { fmt.Printf("%q" ...

  10. Hibernate添加日志--log4j

    需要导入 slf4j-log4j12-1.6.2.jar slf4j-api-1.6.2.jar log4j-1.2.16.jar 三个jar文件 编写properties文件,建议将日志输出级别设置 ...