设计过一款基于开源的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对象转发至该模块。从而实现路山转发的功能。

出处:

http://blog.csdn.net/lnb333666/article/details/7471292

基于XMPP 协议的开发 android的更多相关文章

  1. 基于XMPP协议的Android即时通信系

    以前做过一个基于XMPP协议的聊天社交软件,总结了一下.发出来. 设计基于开源的XMPP即时通信协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务 ...

  2. Android基于XMPP Smack openfire 开发的聊天室

    Android基于XMPP Smack openfire 开发的聊天室(一)[会议服务.聊天室列表.加入] http://blog.csdn.net/lnb333666/article/details ...

  3. IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识

    最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于X ...

  4. 基于XMPP协议的手机多方多端即时通讯方案

    一.开发背景 1.国际背景 随着Internet技术的高速发展,即时通信已经成为一种广泛使用的通信方式.1996年Mirabilis公司推出了世界上第一个即时通信系统ICQ,不到10年间,即时通信(I ...

  5. 基于XMPP协议(openfire服务器)的消息推送实现

    转自:http://blog.csdn.net/nomousewch/article/details/8088277 最近好像有不少朋友关注Android客户端消息推送的实现,我在之前的项目中用到过J ...

  6. .net平台 基于 XMPP协议的即时消息服务端简单实现

    .net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...

  7. 基于XMPP协议的aSmack源码分析

    在研究如何实现Pushing功能期间,收集了很多关于Pushing的资料,其中有一个androidnp开源项目用的人比较多,但是由于长时间没有什么人去维护,听说bug的几率挺多的,为了以后自己的产品稳 ...

  8. 通信——基于Xmpp协议实现的聊天室

    前段时间写了个自定义通信协议的聊天室(即用\r\n标记字符串,作为一句话),总感觉自己弄的那个协议实现虽然简单,但是拓展性就太差了,只适合于发送聊天的内容,难以包含更多的信息.基于上述几点,于是就开始 ...

  9. IOS基于XMPP协议开发--XMPPFramewok框架(二):服务器连接

    连接服务器前需准备事项: 1.搭建好XMPP服务器 2.设置服务器地址和端口 [_xmppStream setHostName:@"127.0.0.1"]; [_xmppStrea ...

随机推荐

  1. 【洛谷】4180:【模板】严格次小生成树[BJWC2010]【链剖】【线段树维护最大、严格次大值】

    P4180 [模板]严格次小生成树[BJWC2010] 题目描述 小C最近学了很多最小生成树的算法,Prim算法.Kurskal算法.消圈算法等等.正当小C洋洋得意之时,小P又来泼小C冷水了.小P说, ...

  2. python IDLE 自动提示功能

    \Python27\Lib\idlelib\目录下 config-extensions.def文件修改等待时间 [AutoComplete] enable=1 popupwait=2000(2000表 ...

  3. Python学习笔记(五)—列表的学习

    总结内容: 1.list的定义 2.list的取值 3.list数据的增加 4.list数据的删除 5.list数据的修改 6.list数据的查询 7.list方法的介绍 8.list的合并 9.多维 ...

  4. php安装配置

    Content 0.序 1.安装前准备 2.安装PHP 3.配置php-fpm 0.序 本文主要是记录php在 Centos下的安装配置 .文中如无特别说明.表示php-5.6.31代码目录. 1.安 ...

  5. Oracle DBA学习篇之SQL_TRACE

    SQL_TRACE ; ; set serveroutput on; alter session set sql_trace=true; select count(*) from firefox; a ...

  6. 对话框上动态控件的创建、在Picture Control控件上显示图片

    1  MFC对话框之上的动态控件的创建 对话框上的控件是MFC类的一个具体对象. 当在对话框之上使用静态控件时,可以根据类向导来为每个控件添加消息.响应函数以及变量. 当需要在对话框中动态的创建某个控 ...

  7. Extjs 事件监听

    <!DOCTYPE html> <html> <head> <title>hello-extjs</title> <meta http ...

  8. eclipse 设置打开java文件代码自动折叠

    eclipse 设置打开java文件代码自动折叠 java: windows/preference/java/editor/folding->enable folding 可以在里面设置所要折叠 ...

  9. 经典数独游戏+数独求解器—纯C语言实现

    "心常乐数独小游戏"(下面简称"本软件")是一款windows平台下的数独游戏软件. 本软件是开源.免费软件. 本软件使用纯C语言编写,MinGW编译,NSIS ...

  10. 使用HTML5画柱状图

    柱状图在很多应用中都比较常见,例如投票结果的统计分析,企业销售数据的统计分析等等.    需求分析:  一个柱状图一般包含以下几部分:  1.标题  2.横坐标(含标题)  3.竖坐标 (含标题.刻度 ...