码迷,mamicode.com
首页 > 移动开发 > 详细

基于XMPP 协议的开发 android

时间:2017-04-23 18:49:14      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:实时   auth   记录   广播   tcp协议   nec   情况   一个栈   executors   

        设计过一款基于开源的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和用户交流的接口。加密模块对发送和接收的消息进行加解密。

以确保通讯数据的安全

技术分享



通讯模块负责与server建立通讯旧。通过创建3个线程来进行处理。分别负责消息的发送、接收和心跳信息的发送;解析模块主要用来解析XML数据流。

依据解析元素不同类型封装成不同的数据对象:数据模块定义整个client中大部分的数据类型和对象;应用模块包含即时通信、图片浏览和音乐播放。

是client和用户交流的接口;加密模块对发送和接收的消息进行加解密。以确保通讯数据的安全。

加密(首先将二进制码转换成BASE64码。在转换成BASE64码之后,再进行MD5加密。)

XMPPserver之间、客户与server之间採用的是TCP连接罔。TCP提供一种瓦向连接、可靠的字节流服务。

保持一个实时双向的传输通道。TCP将用户数据打包构成报文段。它发送数据后启动一个定时器,等待对端数据确认。还有一端对收到的数据进行确认。对失序的数据又一次排序。并丢弃反复数据。TCP提供端到端的流量控制。计算和验证一个强制性的端到端检验。可是GPRS网络对TCP链路存在一个限制。当TCP链路在长时间无有数据流量时。会自己主动减少此链路的优先级直至强制断开此链路。所以在应用中.採用发送心跳的方式来维持此链路。


 数据格式

        XMLXMPP系统架构的核心。它能表述差点儿不论什么一种结构化数据。

特别是XMPP利用XML数据流进行client一server端、server端一server端的通信。XML数据流通常是由client发起至服务端。XML数据流的有效时间直接与用户的在线会话有效时间相关联。


协议消息格式

XMPP协议包含3个顶层XML元素:MessagePresenceIQm

Message用来表示传输的消息。当用户发送一条消息时。

就会在流的上下文中插入一个Message元素。中间实用户发送的相关信息。Presence用来表示用户的状态。当用户改变自己的状态时。就会在数据流的上下文中插入一个Presence元素,用来表示用户如今的状态;IQ用来表示一种请求。响应机制。从一个实体发送请求,另外一个实体接受请求并响应。

后台Servic


技术分享



从类的层次看这个结构比較简单,让其变得复杂的是。其里面有三个线程:主线程。进行Xmpp通信线程,连接出错重试线程。


技术分享


对图说明:

  1. NotificationService里创建一个单线程。让其对server进行连接,因为使用Xmpp连接server要分为三步:连接,注冊。登陆。所以用一个栈来保存要运行的Task任务(ConnectTaskRegisterTaskLoginTask),还后再按这个顺序进行运行。

  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对象后,必须被转发至订:确的模块中加以处理,这就要求有一个路由转发模块。如图33所看到的。

该模块的实现原理是:在系统启动时载入该路由模块,从而在内存中创建了一块路由模块。记录了命名空和功能模块之间的相应关系。当iava对象被封装好之后,系统会读出其命名空间,再在路由表中查找其所相应的模块,从而动态地载入该模块。并将该java对象转发至该模块。从而实现路山转发的功能。

出处:

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





基于XMPP 协议的开发 android

标签:实时   auth   记录   广播   tcp协议   nec   情况   一个栈   executors   

原文地址:http://www.cnblogs.com/cxchanpin/p/6753364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!