标签:实时 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链路在长时间无有数据流量时。会自己主动减少此链路的优先级直至强制断开此链路。所以在应用中.採用发送心跳的方式来维持此链路。
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
标签:实时 auth 记录 广播 tcp协议 nec 情况 一个栈 executors
原文地址:http://www.cnblogs.com/cxchanpin/p/6753364.html