基于XMPP 协议的开发 android
设计过一款基于开源的XMPP即时通信协议的软件。採用C/S协议,通过GPRS无线网络用TCP协议到server。以架设开源的Openfire server作为即时通讯平台
系统主要由下面部分组成:一是:server,负责管理发出的链接或者其他实体的会话。接收或转发XML 数据给client,它与server链接,通过XMPP协议获得由server或不论什么其他相关的服务锁提供的所有功能,三是协议网关的信息与外部消息系统但是不信息间的翻译,再就是XMPP网络,实现各个服务 client间的链接。系统採用client server端架构体系架构
client:
client基于android 平台进行开发。负责初始化通信过程,进行即时通信由client向server创建链接的请求。通过server实现与Androidclient的即时通信脚。
server端:
server端採用Openfire 作为server端。同意多个client同一时候登录并发的链接到一个server上。server对每一个client的链接进行认证,对认证通过的client创建会话,client与server端之间的通信就在该会话的上下文中进行
Android 服务端设计
androidpn 服务端是Java 语言实现的。基于openfire 开源project,Web 部分採用的是Spring 框架,这一点与openfire是不同的,androidpn server包括两个部分。一个是监听特定port上的XMPP服务,负责与client的XMPPConnection 类进行通信,作用是用户注冊和身份认证,并发送推送通知消息。分别数SessionManager
Auth Manager PresenceManager 以及Notification Manager SessionManager 负责管理client与server端的会话。採用轻量级的HTTP server。负责接收用户的web请求。
基本的四个组成部分,各自是SessionManager AuthManager PresenceManager 以及Notification Manager
SessionManager 负责管理client与server之间的会话,AuthManager 负责client用户认证管理,Presence Manager 负责管理Auth
Manager负责client用户认证管理,Presence Manager负责管理client用户的登录状态,NotificationManager负责实现server向client推送消息功能。
系统client基于Android手机平台。採用XMPP作为即时通讯协议。
XMPP是基于XML,实现随意两个网络终端准实时的交换结构化信息的通信协议。
採用Android平台提供的XML解析包对XML进行解析。因为应用活动都执行于主线程。故用多线程技术来解决系统通讯问题。
针对通信安全问题.系统的用户信息和聊天信息在client存储在Android平台自身所带的SQLite数据库中,多媒体文件和图片文件存储在Android平台虚拟文件存储设备SD
Card中。
通讯模块负责与server建立通讯旧。
通过创建3个线程来进行处理。
分别负责消息的发送、接收和心跳信息的发送;解析模块主要用来解析XML数据流。依据解析元素不同类型封装成不同的数据对象:数据模块定义整个client中大部分的数据类型和对象;应用模块包含即时通信、图片浏览和音乐播放。是client和用户交流的接口。加密模块对发送和接收的消息进行加解密。
以确保通讯数据的安全
个线程来进行处理。分别负责消息的发送、接收和心跳信息的发送;解析模块主要用来解析XML数据流。
依据解析元素不同类型封装成不同的数据对象:数据模块定义整个client中大部分的数据类型和对象;应用模块包含即时通信、图片浏览和音乐播放。
是client和用户交流的接口;加密模块对发送和接收的消息进行加解密。以确保通讯数据的安全。
加密(首先将二进制码转换成BASE64码。在转换成BASE64码之后,再进行MD5加密。)
XMPPserver之间、客户与server之间採用的是TCP连接罔。TCP提供一种瓦向连接、可靠的字节流服务。
保持一个实时双向的传输通道。TCP将用户数据打包构成报文段。它发送数据后启动一个定时器,等待对端数据确认。还有一端对收到的数据进行确认。对失序的数据又一次排序。并丢弃反复数据。TCP提供端到端的流量控制。计算和验证一个强制性的端到端检验。可是GPRS网络对TCP链路存在一个限制。当TCP链路在长时间无有数据流量时。会自己主动减少此链路的优先级直至强制断开此链路。所以在应用中.採用发送心跳的方式来维持此链路。
数据格式
XML是XMPP系统架构的核心。它能表述差点儿不论什么一种结构化数据。
特别是XMPP利用XML数据流进行client一server端、server端一server端的通信。XML数据流通常是由client发起至服务端。XML数据流的有效时间直接与用户的在线会话有效时间相关联。
协议消息格式
XMPP协议包含3个顶层XML元素:Message、Presence和IQm。
Message用来表示传输的消息。当用户发送一条消息时。
就会在流的上下文中插入一个Message元素。中间实用户发送的相关信息。Presence用来表示用户的状态。当用户改变自己的状态时。就会在数据流的上下文中插入一个Presence元素,用来表示用户如今的状态;IQ用来表示一种请求。响应机制。从一个实体发送请求,另外一个实体接受请求并响应。
后台Servic:
从类的层次看这个结构比較简单,让其变得复杂的是。其里面有三个线程:主线程。进行Xmpp通信线程,连接出错重试线程。
对图说明:
1. 在NotificationService里创建一个单线程。让其对server进行连接,因为使用Xmpp连接server要分为三步:连接,注冊。登陆。所以用一个栈来保存要运行的Task任务(ConnectTask。RegisterTask,LoginTask),还后再按这个顺序进行运行。
2. 连接Xmppserver的线程用的是Executors.newSingleThreadExecutor(),这个本身能够不停的submit任务。为什么还要自己用一个栈来保存Task了
3. 连接线程在连接,注冊。登陆的过程中,都有可能出错。都可能会失败,这时我就要有一个重连的机制。在Androidpn里开了另外一个线程来进行重试,其重试不是每次都按多少秒来进行重试。而是有其自己的规则。
4. 在LoginTask里,假设登陆了server端。其就会注冊一个监听器,用于监听serverpush的数据包(Packet),再通过发送广播的方式来通知要进行显示的程序。
5. 在登陆server后。也有可能出错,所以在登陆后。会设置一个ConnectionListener,用于监听连接出错的时候。再合适重连线程,进行重连
6. 在登陆过程中。有一种错误要单独处理,就是账号和password无效的时候。这个时候其返回的状态码是401。这样的情况应该把本地保存的帐号和password都清掉,再又一次进行连接。不然会永远都登陆不上server端。
因为该系统全部的功能实现都是基于网络间的XML流的通信。所以。须要有一个模块专门负责网络问通信和XML流的处理,主要功能包含server和client之问通信时TCP套接字的处理,XML流的解析、存储等功能。
数据模块负责XML流的解析和封装的XML模块,主要功能是:将XML流解析成java对象,将iava对象封装成XML流;
其流程是XMPPserver接收到XML流之后,会有渎取器将其读取出来并将其作为入口參数传入XML解析器,XML解析器通过对其命名空间的解析,从而确定将剩余的XML元素解析出来并传入对应的。ava对象中。从而终于将XML转换成iava对象,然后将iava对象传入应用程序模块中,实现其请求完毕的功能并返回iava对象,可是该iava对象不能在网络中直接传输。必须先转换成XML节。于是。该iava对象会被传入XML封装器中。被封装成XML节,通过XMPPserver的发送port发往目的节点。
java对象处理模块处理流程例如以下:当该模块接收到iava对象时,会先将该对象通过解密算法和解密密钥解密成base64码。然后f耳将base64码转换成二进制码,从而实现对java对象的解析。当完毕业务逻辑处理后,该模块会将返回的java对象先由二进制码转换成base64码,然后用加密算法将其加密,这里的加密算法是由两方在建立会话时通过三次握手协议协商的。
当XML节被封装成java对象后,必须被转发至订:确的模块中加以处理,这就要求有一个路由转发模块。如图3—3所看到的。
该模块的实现原理是:在系统启动时载入该路由模块,从而在内存中创建了一块路由模块。记录了命名空和功能模块之间的相应关系。当iava对象被封装好之后,系统会读出其命名空间,再在路由表中查找其所相应的模块,从而动态地载入该模块。并将该java对象转发至该模块。从而实现路山转发的功能。
出处:
基于XMPP 协议的开发 android的更多相关文章
- 基于XMPP协议的Android即时通信系
以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...
- Android基于XMPP Smack openfire 开发的聊天室
Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...
- IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识
最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于X ...
- 基于XMPP协议的手机多方多端即时通讯方案
一.开发背景 1.国际背景 随着Internet技术的高速发展,即时通信已经成为一种广泛使用的通信方式.1996年Mirabilis公司推出了世界上第一个即时通信系统ICQ,不到10年间,即时通信(I ...
- 基于XMPP协议(openfire服务器)的消息推送实现
转自:http://blog.csdn.net/nomousewch/article/details/8088277 最近好像有不少朋友关注Android客户端消息推送的实现,我在之前的项目中用到过J ...
- .net平台 基于 XMPP协议的即时消息服务端简单实现
.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...
- 基于XMPP协议的aSmack源码分析
在研究如何实现Pushing功能期间,收集了很多关于Pushing的资料,其中有一个androidnp开源项目用的人比较多,但是由于长时间没有什么人去维护,听说bug的几率挺多的,为了以后自己的产品稳 ...
- 通信——基于Xmpp协议实现的聊天室
前段时间写了个自定义通信协议的聊天室(即用\r\n标记字符串,作为一句话),总感觉自己弄的那个协议实现虽然简单,但是拓展性就太差了,只适合于发送聊天的内容,难以包含更多的信息.基于上述几点,于是就开始 ...
- IOS基于XMPP协议开发--XMPPFramewok框架(二):服务器连接
连接服务器前需准备事项: 1.搭建好XMPP服务器 2.设置服务器地址和端口 [_xmppStream setHostName:@"127.0.0.1"]; [_xmppStrea ...
随机推荐
- Socket通信原理简介
Socket通信原理简介 字数1011 阅读1766 评论2 喜欢11 何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为 ...
- 谈应用环境下的TIME_WAIT和CLOSE_WAIT[转]
昨天解决了一个HttpClient调用错误导致的服务器异常,具体过程如下: http://blog.csdn.net/shootyou/article/details/6615051 里头的分析过程有 ...
- iOS录音后播放声音小,AudioSessionInitialize failed,AudioQueueStart failed (-50)
方法1: UInt32 audioRoute = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty(kAudioSess ...
- [Database] Redis 随笔
Redis 随笔 1. 特点 非关系数据库 non-relational database 内存数据库 高性能 主从复制 可持久化存储 发布与订阅 支持脚本 2. 数据类型5种 STRING 可以是字 ...
- Namespace declaration statement has to be the very first statement in the script
php 中 Namespace declaration statement has to be the very first statement in the script 错误解决方法: 在PHP文 ...
- Maven学习-使用Nexus搭建Maven私服
为什么要搭建nexus私服,原因很简单,有些公司都不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到 ...
- Python机器学习实战<一>:环境的配置
详细要学习的书籍就是<机器学习实战>Machine Learning in Action,Peter Harrington Windows下要安装3个文件,各自是; 1.Python(因为 ...
- 设置SVN忽略文件和目录(文件夹)
在多数项目中你总会有文件和目录不需要进行版本控制.这可能包括一些由编译器生成的文件,*.obj,*.lst,或许是一个用于存放可执行程序的输出文件夹.只要你提交修改,TortoiseSVN 就会在提交 ...
- Nginx和Tomcat负载均衡实现session共享
以前的项目使用Nginx作为反向代理实现了多个Tomcat的负载均衡,为了实现多个Tomcat之间的session共享,使用了开源的Memcached-Session-Manager框架. 此框架的优 ...
- sqlserver 创建用户仅仅能訪问指定视图
use crm --当前数据库创建角色 exec sp_addrole 'rapp' --分配视图权限 GRANT SELECT ON veiw TO [角色] --指定视图列表 GRANT SEL ...