设计过一款基于开源的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. 洛谷.4252.[NOI2006]聪明的导游(提答 直径 随机化)

    题目链接 随机化 暴力: 随便从一个点开始DFS,每次从之前得到的f[i]最大的子节点开始DFS.f[i]为从i开始(之前)能得到的最大答案. 要注意的是f[i]应当有机会从更小的答案更新, 9.10 ...

  2. Spring Boot 运作原理

    Spring Boot 运作原理 1.Spring Boot 简介 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了 ...

  3. 【ACM-ICPC 2018 沈阳赛区网络预赛】不太敢自称官方的出题人题解

    A. Gudako and Ritsuka 链接 by Yuki & Asm.Def 期望难度:Hard- 考虑从后往前进行博弈动态规划,在这一过程中维护所有的先手必胜区间.区间不妨采用左开右 ...

  4. Windows Phone background Audio 后台音频

    Windows Phone 后台音频的确不是什么新鲜的话题了,但发现目前在WP平台的音频播放应用多多少少会有一些瑕疵,所以在此给大家在此介绍下这个功能给有需要的朋友们. 首先介绍下我们的应用在后台播放 ...

  5. .Net 中DataSet和DataTable的 区别与联系

    1.简要说明二者关系 在我们编写代码的时候从数据库里取出数据,填充到dataset里,再根据表的名字,实例化到 datatable 中.其实使用 dataset 相当于所使用数据库中数据的副本,保存在 ...

  6. golang 关键字以及简单用法说明

    golang只有25个关键字 package: 定义包名, go中任何一个文件必须有一个package, 一般而言,package的定义和文件所属文件夹一致, 并且main函数所在文件的package ...

  7. 关于TFS2010 远程无法创建团队项目的若干问题总结

    今天遇到一个TFS的问题,折腾了好几个小时,故将其记录,给有遇到类似问题的朋友一些参考. 1.本文前提:服务器端只安装了TFS2010,本地没有安装Visual Studio 2010,因此不能在服务 ...

  8. jQuery碎语(3) 动画特效

    5.动画特效 ● 自制折叠内容块 内容块如下 <div class="module"> <div class="caption"> &l ...

  9. MFC绘制直方图和饼图

    转载原文: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNorma ...

  10. appium+python自动化59-appium命令行参数

    Appium服务器参数 许多Appium 1.5服务器参数已被弃用,以支持--default-capabilities标志. 用法: node . [flags] help 1.cmd端口输入,app ...