APP下载

XMPP 协议在Android 即时通讯系统中的应用

2013-12-29李新路

电脑知识与技术 2013年28期

摘要:即时通讯是一种基于互联网的网络应用,目前很多即时通讯系统,如MSN,QQ等,但由于使用了不同的协议,各个系统之间不能互联。可扩展消息与存在协议(XMPP)是即时通讯系统通信协议的标准,该文提出一种基于XMPP协议的即时通讯系统方案,并基于Android平台设计实现了即时通讯客户端,有效的解决了即时通讯系统中通信不畅的问题,并为其他类型智能平台间的即时通信提出一种可参考的解决方案。

关键词:即时通讯;可扩展消息与存在协议 ;Android

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)28-6268-03

目前主流的即时通讯协议主要有可扩展消息与存在协议(XMPP)、空间和即时信息协议(PRIM)、即时信息和空间协议(IMPP)以及针对即时通讯和空间平衡扩充的会话初始协议SIP(SIMPLE)。其中,XMPP协议是基于XML的协议,高度自由、高度开发,并易于掌握,其技术规格已经被IETF互联网工程小组定义在RFC3920及RFC3921,任何遵循XMPP协议的软件都可以实现相互通讯。[1]

本文遵循XMPP协议,基于Android操作系统设计实现即时通讯系统,使用Openfire服务器及Smack客户端类库实现即时通讯的基本功能,解决不同即时通讯软件的通信问题。

1 XMPP协议分析

1.1 XMPP的体系结构

XMPP协议采用客户端—服务器架构,其基本网络结构中定义了三种角色:客户端、服务器和网关;XMPP服务器支持服务器之间DNS路由,所有从客户端到客户端的数据和消息都需要经过XMPP服务器进行转发。[2]

1.2 XMPP的消息格式

基于XMPP协议即时通讯的核心是XML流传输协议,它以片段的形式在网络上发送XML流,即在TCP连接上传输XML流,是XMPP即时通讯指令的传递手段。[3]

XMPP协议的XML流包含了三种元素,其中,元素用于确定用户的订阅状态,可以查询、询问好友的在线状态,同时也可以发布自己的在线状态;元素用于两个XMPP用户之间发送消息,它规定了消息的源节点、目的节点、发送方式和消息的内容等;元素管理XMPP服务器上任意两个用户间的转换,并且允许他们通过相应的XML格式的查询。

1.3 XMPP的安全机制

XMPP协议族一共有四层,从底层到上层分别是TCP协议、TLS协议、SASL协议和XMPP协议层。如图1。

为了提供通信的保密性和数据完整性,在TCP传输协议之上,XMPP协议族引入了安全传输层协议(TLS),防止服务器间发送的数据被篡改或偷听,保证了在传输过程中数据的安全。TLS协议由两层组成:TLS记录协议(TLS Record)和TLS握手协议(TLS Handshake)。[2][6]此外,XMPP协议族还支持SASL认证(简单认证与安全层),以支持多种认证机制。

2 服务器端设计

2.1 Openfire

Openfire 是基于XMPP 协议的即时通讯服务器端的一个实现,是一个开源的实时协作(RTC)服务器,采用并实现了插件机制,方便扩展。由于采用了开放的XMPP协议,我们可以使用各种支持XMPP协议的即时通讯客户端软件访问服务器。[5]

2.2 信息认证

在XMPP服务器中,各客户端之间的连接都需要通过服务器进行转发,服务器端对每个客户端的连接请求进行认证操作。服务器设计了认证组件,首先要调用XML解析模块对客户端用户发送的XML消息进行解析,获得用户的认证信息,认证组件将对认证信息进行认证,最终将认证结果返回给客户端用户。流程图如图2: [4][5]

2.3 消息处理

服务器消息处理主要任务是为获取信息认证后,针对每个客户端的连接建立一个与客户端地址结构相关的会话,并且在会话的上下文中进行消息的发送和接收。[3]

Openfire服务器采用线程技术来提高服务器处理消息的性能,同时使用线程池来管理线程,为每个连接服务器的客户端用户创建单独的会话,每个会话对应于一个线程池中的线程。当服务器收到了客户端发送过来的消息,经过处理后立即交给相应的会话线程来进行处理;同时客户端在与服务器取得连接后也会建立对应的会话,此时由这两个会话负责客户端和服务器端的消息传输,利用这种线程池和会话机制就可以保证消息传输的即时性。

3 客户端设计

3.1 Smack类库

Smack是一个易于使用的XMPP(jabber)客户端Java类库,它封装了一系列的方法,这些方法提供了关于XMPP协议XML数据的组装,当我们需要传输XMPP协议的数据时,只需要调用Smack提供的方法就可以自动封装成XMPP协议的数据流,可以对Smack类库进行修改和二次开发,使其支持Android平台即时通讯客户端开发。

3.2 客户端逻辑架构

系统客户端采用MVC设计模式进行设计,将逻辑代码与视图层以及数据模型层进行分离,实现系统的松散耦合,便于系统的维护和代码的重用。[6][7]客户端逻辑架构图如下:

3.3 客户端模块设计

注册模块调用Smack类库中的createAccount()方法,将用户注册的用户名账号和密码封装成XML数据包发送给数据库,并等待服务器回复的返回码,根据返回码判断是否注册成功。

登录界面是由LoginActivity类创建,由LoginService发送登录请求给服务器,为了不阻塞主线程,在LoginService中开启一个新的线程来与服务器进行交互,同时使用Smack类库中ConnectionConfiguration类配置一些连接信息,如服务器域名或IP地址。

用户登录模块主要XMPPConnection类实现,可以获取服务器返回的好友信息,若登录成功,服务器会返回该用户的所有好友信息,在线状态信息。

会话模块负责创建会话和管理会话信息,这是即时通讯系统的核心。Smack类库中的sendMessage ()方法实现了消息的发送,所有会话信息都需要经过服务器中转,所以sendMessage()方法发送的信息先要发送给服务器,由服务器转发给指定用户。此时,其他用户需要添加一个监听器,监听外来数据包的变化,才能接受服务器转发的信息。

文件传输模块是即时通讯系统的主要扩展功能,文件的发送可以调用Smack类库的FileTransferManager类来实现,需要注意的是文件传输会占用较多处理机资源,容易阻塞线程,因而需要开启FileTransferService服务处理整个发送传输过程。

4 结束语

本文分析了XMPP协议以及基于此协议的Openfire服务器和Smack类库的使用,提出了基于XMPP协议的Android即时通讯系统的解决方案。经过验证,此方案可以实现Android设备之间,Android设备与PC机之间基于XMPP协议的即时通讯,也为其他平台,如IOS与Android之间的通信提供参考。

参考文献:

[1] XMPP Protocol [EB/OL].http://xmpp.org.

[2] 潘晓丰.基于XMPP的企业IM的研究及实现[D].北京:中国科学院计算技术研究所,2006.

[3] 陈武.基于XMPP的企业级即时通信系统的研究与实现[D].武汉:武汉理工大学,2009.

[4] 贾琴勇.即时通讯系统的研究与实现[D].武汉:武汉理工大学,2008.

[5] Openfire.[EB/OL]. http://www.igniterealtime.org.

[6] Android.[EB/OL].http://developer.android.com/index.html.

[7] 郭宏志.Android应用开发详解[M].北京:电子工业出版社,2010.