引言:这段时间由于公司开发需要,正学习怎开发一个即时通讯APP,发现很多即时通讯软件如米聊,都是采用XMPP作为即时通讯协议,XMPP作为目前主流的四种IM协议之一,确实有必要了解一下,故在这里做了个学习总结。
一、简介
1、一句话定义
XMPP是一款开源的即时通讯协议,采用C/S体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfire服务器作为即时通讯平台。
2、核心
XML流传输协议和基于XML流传输的即时通讯扩展应用
3、系统组成
服务器:负责管理发出的连接或者与其他实体的会话,接收或转发XML流元素给授权的客户端、服务器等;
客户端:它与服务器相连,通过XMPP获得由服务器或任何其它相关的服务所提供的全部功能;
协议网关(网关):完成XMPP协议传输的信息与外部消息系统可识别信息间的翻译;
XMPP网络:实现各个服务器、客户端间的连接。
4、基本网络结构
二、C/S设计
服务器端设计(有成品)
androidpn服务器端是java语言实现的,基于openfire开源工程,Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是监听特定端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。
主要的四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。
客户端设计
1、 初步认识
系统客户端基于Android手机平台。
采用XMPP作为即时通讯协议。XMPP是基于XML,实现任意两个网络终端准实时的交换结构化信息的通信协议。
采用Android平台提供的XML解析包对XML进行解析。由于应用活动都运行于主线程。故用多线程技术来解决系统通讯问题。
针对通信安全问题.系统的用户信息和聊天信息在客户端存储在Android平台自身所带的SQLite数据库中,多媒体文件和图片文件存储在Android平台虚拟文件存储设备SD Card中。
2、 分模块设计
l 通讯模块:与服务器建立通讯。通过创建3个线程来进行处理,分别负责消息的发送、接收和心跳信息的发送。
l 解析模块:解析XML数据流。根据解析元素不同类型封装成不同的数据对象。
l 加密模块:加密解密。对发送和接收的消息进行加解密,以确保通讯数据的安全。
(加密:首先将二进制码转换成BASE64码,在转换成BASE64码之后,再进行MD5加密。)
l 数据模块:定义数据类型和对象。定义整个客户端中大部分的数据类型和对象。
l 应用模块:包括用户管理、即时通信、图片浏览和音乐播放。是客户端和用户交流的接口。
Ø 客户端和服务器的关系
XMPP服务器之间、客户端与服务器之间采用的是TCP连接。TCP提供一种面向连接、可靠的字节流服务,保持一个实时双向的传输通道。TCP将用户数据打包构成报文段,它发送数据后启动一个定时器,等待对端数据确认,另一端对收到的数据进行确认,对失序的数据重新排序,并丢弃重复数据;TCP提供端到端的流量控制,计算和验证一个强制性的端到端检验。但是GPRS网络对TCP链路存在一个限制。当TCP链路在长时间无有数据流量时,会自动降低此链路的优先级直至强制断开此链路。所以在应用中,采用发送心跳的方式来维持此链路。
三、数据格式
XML是XMPP系统架构的核心。
它能表述几乎任何一种结构化数据。特别是XMPP利用XML数据流进行客户端-服务器端、服务器端-服务器端的通信。XML数据流一般是由客户端发起至服务器端,XML数据流的有效时间直接与用户的在线会话有效时间相关联。
四、协议消息格式
XMPP协议包括3个顶层XML元素:Message、Presence和IQ。
Message用来表示传输的消息。当用户发送一条消息时,就会在流的上下文中插入一个Message元素,中间有用户发送的相关信息。
Presence用来表示用户的状态。当用户改变自己的状态时,就会在数据流的上下文中插入一个Presence元素,用来表示用户现在的状态。
IQ用来表示一种请求/响应机制,从一个实体发送请求,另外一个实体接受请求并响应。
五、基于XMPP的IM实现
要想在Android中使用XMPP协议进行即时通讯,需要首先了解3个主要的东西——Openfire、Smack和Spark。通过结合Openfire、Smack和Spark,就能实现完整的XMPP IM实现。
Openfire主要是作为服务器,负责管理客户端的通信连接,以及提供客户端一些通信信息和连接信息。
Smack主要是XMPP协议的实现,提供了一套很好的API,所以下面操作XMPP都是通过使用Smack的API来实现,当然因为是在Android里,所以使用的是Asmack这个包,里面方法跟Smack包差不多。
Spark 是IM客户端的实现,其实就是使用了Smack 的API实现的。
开发环境的配置
1、 配置Openfire服务器
2、 配置spark客户端
3、 使用smack测试即时通讯功能
详情参考:Openfire+Spark安装手册http://wenku.baidu.com/view/784b2165f5335a8102d22062.html
搭建Openfire服务器+测试2款IM客户端
http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997052.html
基于XMPP协议的手机多方多端即时通讯方案
http://www.cnblogs.com/luxiaofeng54/archive/2011/03/14/1984026.html
win7(windows 7)系统下安装SQL2005(SQLServer 2005)图文教程
http://www.cnblogs.com/icewee/articles/2019783.html
四、实现基于Asmack的Android客户端通信
后文待续
附录
XMPP协议官网相关内容介绍:
http://blog.csdn.net/wenzuodan/article/details/3078512