即时通信技术(IM)支持用户在线实时交谈。若是要发送一条信息,用户须要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容。大多数经常使用的即时通信发送程序都会提供各类各样的功能javascript
可扩展通信和表示协议(XMPP):用于流式传输准实时通讯、表示和请求 - 响应服务等的 XML 元素。XMPP 基于 Jabber 协议,是用于即时通信的一个开放且经常使用的协议。尽管 XMPP 没有被任何指定的网络架构所融合,它仍是常常会被用于客户机 / 服务器架构当中,客户机须要利用 XMPP 协议经过 TCP 链接来访问服务器,而服务器也是经过 TCP 链接进行相互链接。 html
即时通信对话初始协议和表示扩展协议(SIMPLE):SIMPLE 协议为 SIP 协议指定了一整套的架构和扩展方面的规范,而 SIP 是一种网际电话协议,可用于支持 IM /消息表示。SIP 可以传送多种方式的信号,如 INVITE 信号和 BYE 信号分别用于启动和结束会话。 SIMPLE 协议在此基础上还增长了另外一种方式的请求,即 MESSAGE 信号,可用于发送单一分页的即时通信内容,即分页模式的即时通信。SUBSCRIBE 信号用于请求把显示信息发送给请求者,而 NOTIFY 信号则用于传输显示信息。较长 IM 对话的参与者们须要传输多种的延时信息,它们使用 INVITE 和一个叫作消息会话中继协议(MSRP)。与 SIMPLE 协议结合,MSRP 协议可用于 IM 的文本传输,正如与 SIP 协议相结合,RTP 协议就能够用于传输 IP 电话中的语音数据包同样。 java
Jabber: Jabber 是一种开放的、基于 XML 的协议,用于即时通信消息的传输与表示。国际互联网中成千上万的服务器都使用了基于 Jabber 协议的软件。Jabber 系统中的一个关键理念是 “传输”,也叫作“网关”,支持用户使用其它协议访问网络 — 如 AIM 和 ICQ、MSN Messenger 和 Windows Messenger、SMS 或 E-mail。 android
即时通信通用结构协议(CPIM):CPIM 定义了通用协议和消息的格式,即时通信和显示服务都是经过 CPIM 来达到 IM 系统中的协做。 git
网际转发聊天协议(IRCP):IRCP 支持两个客户计算机之间、一对多(所有)客户计算机和服务器对服务器之间的通讯。该协议为大多数网际即时通信和聊天系统提供了技术基础。IRC 协议在 TCP/IP 网络系统中已经获得了开发,尽管没有需求指定这是 IRC 协议的惟一操做环境。IRC 协议是一种基于文本的协议,使用最简单的客户端程序就可做为其链接服务器的接口(socket)程序。 github
设计基于开源的XMPP即时通讯协议,采用C/S体系结构,经过GPRS无线网络用TCP协议链接到服务器,以架设开源的Openfn'e服务器做为即时通信平台。 算法
系统主要由如下部分组成: spring
客户端基于Android平台进行开发。负责初始化通讯过程,进行即时通讯时,由客户端负责向服务器发起建立链接请求。系统经过GPRS无线网络与Internet网络创建链接,经过服务器实现与Android客户端的即时通讯。 数据库
服务器端则采用Openfire做为服务器。容许多个客户端同时登陆而且并发的链接到一个服务器上。服务器对每一个客户端的链接进行认证,对认证经过的客户端建立会话,客户端与服务器端之间的通讯就在该会话的上下文中进行。 安全
参考: http://www.ithao123.cn/content-1494500.html
1.1服务器端设计(这块几乎能够说是有成品了。不用多纠结)
androidpn服务器端是java语言实现的,基于openfire开源工程,Web部分采用的是spring框架,这一点与 openfire是不一样的。Androidpn服务器包含两个部分,一个是监听特定端口上的XMPP服务,负责与客户端的XMPPConnection类 进行通讯,做用是用户注册和身份认证,并发送推送通知消息。另一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。
主要的四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登陆状态,NotificationManager负责实现服务器向客户端推送消息功能。
系统客户端基于Android手机平台。采用XMPP做为即时通信协议。XMPP是基于XML,实现任意两个网络终端准实时的交换结构化信息的通讯协议。采用Android平台提供的XML解析包对XML进行解析。因为应用活动都运行于主线程。故用多线程技术来解决系统通信问题。针对通讯安全问题.系统的用户信息和聊天信息在客户端存储在Android平台自身所带的SQLite数据库中,多媒体文件和图片文件存储在Android平台虚拟文件存储设备SD Card中。
通信模块负责与服务器创建通信旧。经过建立3个线程来进行处理。分别负责消息的发送、接收和心跳信息的发送;解析模块主要用来解析XML数据流。根据解析元素不一样类型封装成不一样的数据对象:数据模块定义整个客户端中大部分的数据类型和对象;应用模块包括即时通讯、图片浏览和音乐播放。是客户端和用户交流的接口;加密模块对发送和接收的消息进行加解密。以确保通信数据的安全。
系统的客户端分为5大模块进行设计开发,如图2所示。
通信模块负责与服务器创建通信旧。经过建立3个线程来进行处理。分别负责消息的发送、接收和心跳信息的发送;解析模块主要用来解析XML数据流。根据解析元素不一样类型封装成不一样的数据对象:数据模块定义整个客户端中大部分的数据类型和对象;应用模块包括即时通讯、图片浏览和音乐播放。是客户端和用户交流的接口;加密模块对发送和接收的消息进行加解密。以确保通信数据的安全。
加密(首先将二进制码转换成BASE64码,在转换成BASE64码以后,再进行MD5加密,)
XMPP服务器之间、客户与服务器之间采用的是TCP链接罔。TCP提供一种瓦向链接、可靠的字节流服务。保持一个实时双向的传输通道。 TCP将用户数据打包构成报文段。它发送数据后启动一个定时器,等待对端数据确认,另外一端对收到的数据进行确认,对失序的数据从新排序,并丢弃重复数 据;TCP提供端到端的流量控制。计算和验证一个强制性的端到端检验。可是GPRS网络对TCP链路存在一个限制。当TCP链路在长时间无有数据流量时。 会自动下降此链路的优先级直至强制断开此链路。因此在应用中.采用发送心跳的方式来维持此链路。
数据格式
XML是XMPP系统架构的核心。它能表述几乎任何一种结构化数据。特别是XMPP利用XML数据流进行客户端一服务器端、服务器端一服务器端的通讯。XML数据流通常是由客户端发起至服务端,XML数据流的有效时间直接与用户的在线会话有效时间相关联。
协议消息格式
XMPP协议包括3个顶层XML元素:Message、Presence和IQm。Message用来表示传输的消息,当用户发送一条消息时。就会 在流的上下文中插入一个Message元素,中间有用户发送的相关信息;Presence用来表示用户的状态。当用户改变本身的状态时。就会在数据流的上 下文中插入一个Presence元素,用来表示用户如今的状态;IQ用来表示一种请求,响应机制,从一个实体发送请求,另一个实体接受请求并响应。
后台Servic:
从类的层次看这个结构比较简单,让其变得复杂的是,其里面有三个线程:主线程,进行Xmpp通讯线程,链接出错重试线程。
对图说明:
1. 在NotificationService里建立一个单线程,让其对服务器进行链接,因为使用Xmpp链接服务器要分为三步:链接,注册,登录。因此用一个栈来保存要执行的Task任务(ConnectTask,RegisterTask,LoginTask),还后再按这个顺序进行执行。
2. 链接Xmpp服务器的线程用的是Executors.newSingleThreadExecutor(),这个自己能够不停的submit任务。为何还要本身用一个栈来保存Task了
3. 链接线程在链接,注册,登录的过程当中,都有可能出错,均可能会失败,这时我就要有一个重连的机制,在Androidpn里开了另一个线程来进行重试,其重试不是每次都按多少秒来进行重试,而是有其本身的规则。
4. 在LoginTask里,若是登录了服务器端,其就会注册一个监听器,用于监听服务器push的数据包(Packet),再经过发送广播的方式来通知要进行显示的程序。
5. 在登录服务器后,也有可能出错,因此在登录后,会设置一个ConnectionListener,用于监听链接出错的时候,再合适重连线程,进行重连
6. 在登录过程当中,有一种错误要单独处理,就是帐号和密码无效的时候,这个时候其返回的状态码是401,这种状况应该把本地保存的账号和密码都清掉,再从新进行链接,否则会永远都登录不上服务器端。
因为该系统全部的功能实现都是基于网络间的XML流的通讯,因此,须要有一个模块专门负责网络问通讯和XML流的处理,主要功能包括服务器和客户端之问通讯时TCP套接字的处理,XML流的解析、存储等功能。
数据模块负责XML流的解析和封装的XML模块,主要功能是:将XML流解析成java对象,将iava对象封装成XML流;
其流程是XMPP服务器接收到XML流以后,会有渎取器将其读取出来并将其做为入口参数传入XML解析器,XML解析器经过对其命名空间的 解析,从而肯定将剩余的XML元素解析出来并传入相应的;ava对象中,从而最终将XML转换成iava对象,而后将iava对象传入应用程序模块中,实 现其请求完成的功能并返回iava对象,可是该iava对象不能在网络中直接传输,必须先转换成XML节,因而,该iava对象会被传入XML封装器中, 被封装成XML节,经过XMPP服务器的发送端口发往目的节点。
java对象处理模块处理流程以下:当该模块接收到iava对象时,会先将该对象经过解密算法和解密密钥解密成base64码,而后f耳将 base64码转换成二进制码,从而实现对java对象的解析。当完成业务逻辑处理后,该模块会将返回的java对象先由二进制码转换成base64码, 而后用加密算法将其加密,这里的加密算法是由双方在创建会话时经过三次握手协议协商的。
当XML节被封装成java对象后,必须被转发至订:确的模块中加以处理,这就要求有一个路由转发模块,如图3—3所示。该模块的实现原理 是:在系统启动时加载该路由模块,从而在内存中建立了一块路由模块,记录了命名空和功能模块之间的对应关系,当iava对象被封装好以后,系统会读出其命 名空间,再在路由表中查找其所对应的模块,从而动态地加载该模块,并将该java对象转发至该模块,从而实现路山转发的功能