XMPP(Extensible Messaging and Presence Protocol,可扩展的消息和出席协议)是一种基于XML的传递消息路由和出席信息(Presence)的协议,它为不同的网络之间互联提供了一种安全而简单的编程语言,是Jabber系统(一种开放源代码的即时通信IM系统,Openfire系统的前称)的基础,其所具备的开放特性,使开发者之间互相合作,促进了即时通信领域技术的进步与交流.对用户而言,在面对现有的各种即时通信服务,没有统一标准,无法实现互联互通的局面下,XMPP的出现,实现了整个即时通信服务协议的统一,促进了服务器之间的准即时操作.即使其操作系统和浏览器不同的情况下,XMPP协议将最终允许因特网任何用户之间的消息传送.近几年来,由于即时通信(IM)巨大的商业价值,仅国内就出现了QQ,网易泡泡,新浪UC等多种IM系统.本文将从实际项目开发的角度出发,探讨XMPP协议及其服务器端实现的应用. 在IETF 中,把IM协议划分为四种协议,即即时信息和出席协议(Instant Messaging and Presence Protocol, IMPP)、出席和即时信息协议(Presence and Instant Messaging Protocol, PRIM)、针对即时信息和出席扩展的会话发起协议(Sessi TYPE="audio/mpeg"> XMPP相对与其他几种IM协议而言,有如下的优点: 1. XMPP 协议是公开的,由JSF开源社区组织开发的。XMPP 协议并不属于任何的机构和个人,而是属于整个社区,这一点从根本上保证了其开放性。 2. XMPP 协议具有良好的扩展性。在XMPP 中,即时消息和到场信息都是基于XML 的结构化信息,这些信息以XML 节(XML Stanza)的形式在通信实体间交换。XMPP 发挥了XML 结构化数据的通用传输层的作用,它将出席和上下文敏感信息嵌入到XML 结构化数据中,从而使数据以极高的效率传送给最合适的资源。基于XML 建立起来的应用具有良好的语义完整性和扩展性。 3. 分布式的网络架构。XMPP 协议都是基于Client/Server 架构,但是XMPP协议本身并没有这样的限制。网络的架构和电子邮件十分相似,但没有结合任何特定的网络架构,适用范围非常广泛。 4. XMPP 具有很好的弹性。XMPP 除了可用在即时通信的应用程序,还能用在网络管理、内容供稿、协同工具、档案共享、游戏、远端系统监控等。 5. 安全性。XMPP在Client-to-Server通信,和Server-to-Server通信中都使用TLS (Transport Layer Security)协议作为通信通道的加密方法,保证通信的安全。任何XMPP服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术更加增强了通信的安全性。如下图所示: 本文的目标是通过研究XMPP协议,理解XMPP协议的系统架构及其通信原理。在此基础上,重点研究XMPP协议的服务器端实现,在项目中采用了Openfire服务器端技术。 本文其余章节安排如下: 第二章对XMPP协议系统结构的描述,将XMPP协议网络中的组成部分及其功能进行了阐述。 第三章详细阐述了XMPP协议的通讯格式,这是协议通信的底层基础,所有的网络通信均依靠Message,Presence以及IQ元素来传递。 第四章通过一个实例演示了XMPP协议的通信流程,本章内容建立在第三章基础之上。 第五章是对XMPP服务器端的Openfire实现的一个简单介绍,描述了实际项目中针对Openfire所要做的二次开发内容,是下一步的实际操作重点。 IETF 已经将Jabber 定为即时通信和现场技术的标准协议,并改名为XMPP,相关的规范是RFC3920 和RFC3921,并且,JSF 也在它的XEP (XMPP Extensi TYPE="audio/mpeg"> 图2.1 XMPP网络架构 2.2.1 XMPP客户端 XMPP 系统的一个设计标准是必须支持简单的客户端。事实上,XMPP 系统架构对客户端只有很少的几个限制。一个XMPP 客户端必须支持的功能有: 1. 通过 TCP 套接字与XMPP 服务器进行通信; 2. 解析组织好的 XML 信息包; 3. 理解消息数据类型。 XMPP 将复杂性从客户端转移到服务器端。这使得客户端编写变得非常容易,更新系统功能也同样变得容易。XMPP 客户端与服务端通过XML 在TCP 套接字的5222 端口进行通信,而不需要客户端之间直接进行通信。 基本的XMPP 客户端必须实现以下标准协议(XEP-0211): RFC3920 核心协议Core RFC3921 即时消息和出席协议Instant Messaging and Presence XEP-0030 服务发现Service Discovery XEP-0115 实体能力Entity Capabilities 2.2.2 XMPP服务器 XMPP 服务器遵循两个主要法则: l 监听客户端连接,并直接与客户端应用程序通信; l 与其他 XMPP 服务器通信; XMPP开源服务器一般被设计成模块化,由各个不同的代码包构成,这些代码包分别处理Sessi xmlns ="jabber: client":xmlns: stream= ''http://etherx./streams''versi id="agsXMPP_1"> <query xmlns = "jabber:iq:auth"> <username> test </username> <password> <digest></query> </iq> (4)服务器端收到用户名等待用户提供密码 <iq xmlns ="jabber:client"from ="localhost" type = "result"id ="agsXMPP_1"> <query xmlns ="jabber:iq:auth"><username>test </username> <password/> <digest/></query> </iq> (5)客户端提供加密后的密码 <iq xmlns="jabber:client" id="agsXMPP_2" to="localhost" type="set"> <query xmlns="jabber:iq:auth"><username>test</username><digest> e66557d2b67256bf7e9b3l7 5lb6l0l674a56b5e </digest ><resource>MiniClient </resource></query> </iq> (6)服务器端从数据库验证用户名和密码,并返回结果 <iq xmlns="jabber:client" from=" localhost" type="result" id="agsXMPP_2"/> (7) 如果返同错误.客户端提示并中断连接,否则客户端发送响应数据。 (8) 服务器端返回数据。 (9) 客户端发送状态。 (10) 服务器收到状态,发送IQ节并通知其他用户。 Openfire(原名Wildfire)是基于XMPP协议由Jive software公司开发的一个开源项目.它是实现XMPP协议的Server端包.Openfire与客户端采用的是C/S架构.一个服务器要负责为连接在其上的客户端提供服务.Openfire是由Java语言编写的具有跨平台能力的一款优秀开源软件。 选择Openfire作为业务服务器是因为其自身的诸多优点: (1) Openfire内部集成Resin Web服务器,可以设计基于Web的管理程序。 (2) 实现了插件机制,方便扩展。服务器在运行的时候,会定时地扫描一个特定目录下的文件,当发现有新的Jar包出现时,就读入它所有的类,分析类中有没有支持插件接口的类,如果有,就加载并运行它。 (3) 用户容量方面,单台服务器可支持上万并发用户。在测试环境下可以支持5000用户同时在线,每秒可以转发2000个包。 (4) Openfire安装和使用都非常简单。 Openfire 是XMPP的服务器端实现,在基于Openfire的IM系统中,客户端和服务器之间的通信是依靠底层Smack库提供的各种功能来完成的。而利用插件方式来扩展Openfire 服务器端主要有两种扩展方式,一种是对服务器控制台页面进行扩展(不是开发的主要目标),其实就是遵循Openfire 页面的布局方式,进行相应的页面扩展和功能扩展;另一种是对通信功能进行扩展。本文主要针对后者进行具体的描述. Openfire插件开发的大致如下: 1、创建/修改openfire的plugin.xml(这是整个插件最关键的配置文件); 2、创建服务器插件实例(实现Plugin 接口的类和一批IQHandler); 3、打包插件(Openfire 插件有自己的打包方式)和部署插件 ; 详细的插件开发指南不是本文的内容,可以参考Openfire项目的插件开发指南,详见参考文献http://www./builds/openfire/docs /latest/documentati TYPE="audio/mpeg"> |
|