Androidpn 简单实现及分析
(文中部分内容来自网络)
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技术实现:
(这里就不说下载源码后怎么操作了,网上教程颇多)
客户端与服务器建立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()方法给相应用户发送数据达到通信。
Androidpn 简单实现及分析的更多相关文章
- Greenplum 简单性能测试与分析
如今,多样的交易模式以及大众消费观念的改变使得数据库应用领域不断扩大,现代的大型分布式应用系统的数据膨胀也对数据库的海量数据处理能力和并行处理能力提出了更高的要求,如何在数据呈现海量扩张的同时提高处理 ...
- JUC之线程池基础与简单源码分析
线程池 定义和方法 线程池的工作时控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完成,再从队列中取出任 ...
- 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d14047603a5bf1242ad01b 导语 内存泄漏问题大约是An ...
- 深入浅出 - Android系统移植与平台开发(十) - led HAL简单设计案例分析
作者:唐老师,华清远见嵌入式学院讲师. 通过前两节HAL框架分析和JNI概述,我们对Android提供的Stub HAL有了比较详细的了解了,下面我们来看下led的实例,写驱动点亮led灯,就如同写程 ...
- GreenPlum简单性能测试与分析
版权声明:本文由黄辉原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/195 来源:腾云阁 https://www.qclou ...
- NetAnalyzer笔记 之 二. 简单的协议分析
[创建时间:2015-08-27 22:15:17] NetAnalyzer下载地址 上篇我们回顾完了NetAnalyzer一些可有可无的历史,在本篇,我决定先不对NetAnalyzer做介绍,而是先 ...
- 比特币区块结构Merkle树及简单支付验证分析
在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...
- Redis 协议为例谈简单的协议分析
怎样去研究一个协议的过程,协议的格式,好处,怎么样模拟发包等,下面是一个简单的过程记录. 研究的步骤: 协议相关的资料,RFC,官方文档等.弄清楚协议工作在4层还是7层,是二进制还是文本协议等 抓包, ...
- <数据结构基础学习>(二)简单的时间复杂度分析
一.简单的复杂度分析 O(1) O(n) O(logn) O(logn) O(n^2) 大O描述的是算法的运行事件和输入数据之间的关系 Eg: 数组求和 public static int sum(i ...
随机推荐
- git(8):常用命令
Git常用操作命令收集: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote -v ...
- Asp.net页面中调用soapheader进行验证的操作步骤
Asp.net页面中调用以SOAP头作验证的web services操作步骤 第一步:用来作SOAP验证的类必须从SoapHeader类派生,类中Public的属性将出现在自动产生XML节点中,即: ...
- spring c3p0 配置
spring c3p0 配置 <?xml version="1.0" encoding="UTF-8"?> <beansxmlns=& ...
- maven pom属性 详解
pom.xml文件(实践用):<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...
- JIRA python篇之统计产品尚未解决的bugs
[本文出自天外归云的博客园] 通过python中的jira类我们可以方便的操作jira,获取一些我们想要再加工的信息. 一些通过JIRA的JTL查询语句不方便直接搜索的过滤条件可以通过JIRA的pyt ...
- iOS微信实现第三方登录的方法
这篇文章主要介绍了iOS微信第三方登录实现的全过程,一步一步告诉大家iOS微信实现第三方登录的方法,感兴趣的小伙伴们可以参考一下 一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2 ...
- AR2220 通过cpu-defend policy处理大量大量arp广播的小技巧
今天发现有局域网里面有几台电脑中毒了,在大量的发送ARP报文,导致设备cpu利用率很高. 一.查看display cpu-defend statistics 发现arp-reply arp-requ ...
- Python Garbage Collection 与 Objective-C ARC
转载请注明出处 http://blog.csdn.net/u014205968/article/details/69389363 Python GC 与 Objective-C ARC 提起GC(Ga ...
- mysql找到所有索引
SELECT a.TABLE_SCHEMA,a.TABLE_NAME,a.index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) AS ` ...
- 一图让你看懂CSS盒子模型