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 ...
随机推荐
- linux命令(48):打乱一个文本文件的所有行
如果用python读进内存再打乱的思路,如果大文件的话,就比较麻烦了 网上找到一个简单的方法,shuf: $ shuf --help 用法: shuf [选项]... [文件] 或者: shuf -e ...
- 21、uwp UI自动化测试(WinAppDriver)
使用 UI自动化测试的好处就是在代码逻辑中写好 case 后,来实现 “一劳永逸” 的作用,并且自动化测试能够模拟人工达不到要求,比如快速切换页面.快速点击按钮等,对于提高软件的稳定性很有帮助. 安装 ...
- 深入HBase架构解析(一)[转]
前记 公司内部使用的是MapR版本的Hadoop生态系统,因而从MapR的官网看到了这篇文文章:An In-Depth Look at the HBase Architecture,原本想翻译全文,然 ...
- LeetCode: Balanced Binary Tree 解题报告
Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a he ...
- LVS之NAT模型、DR模型配置和持久连接
前言:继LVS概述,本篇实现NAT模型和DR模型下的负载均衡. NAT模型: LVS-NAT基于cisco的LocalDirector.VS/NAT不需要在RealServer上做任何设置,其只要能提 ...
- 删除mysql备份文件
前言:前篇介绍了mysql的备份方法,但备份不是越多越好,如果磁盘空间不够用,我需要保留近一个周的备份就可以了,那就需要删除备份脚本了,特别注意删除操作比较危险,变量传参要进行二次确认. 下面给出删除 ...
- C#学习笔记(7)——委托
说明(2017-5-29 22:22:50): 1. 语法:public delegate void mydel();这一句在类外面,命名空间里面. 2. 专门新建一个方法,参数是委托: public ...
- 4. EM算法-高斯混合模型GMM详细代码实现
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 EM ...
- APMServ升级php 与 Wamp升级PHP版本到5.3
方法一:(我亲测试,没问题)首先下载:php-5.3.1-Win32-VC6-x86.ziphttp://windows.php.net/downloads/releases/archives/ 解压 ...
- iOS内存管理和优化 from 刘延军