个人发展路线: 面向终端的移动架构路线,包括用户体验的研究,终端架构的分析及终端底层设计。 个人介绍: 目前从事Android应用系统框架研发以及即时通信软件研发。
2013年(5)
分类: 架构设计与优化
2013-03-14 23:59:45
XMPP协议体的研究及实践
发布者:JECON
一、XMPP协议简介
最近在接手一些终端项目中涉及到即时通讯,相比之下,以前从未接受过这种培训。于是上网查了很多资料,从中发现在面向终端部署的即时通讯软件,大都采用了XMPP进行协议传输的。
XMPP为何如此流行实际上跟XMPP本身的特性有关。XMPP是一种基于XML的协议,它继承了XML环境中灵活的发展性。经过扩展以后的XMPP可以通过发送扩展信息来处理用户的需求。
相比之下,与我们曾经使用过的WebService和一些其他的各类基于HTTP协议的通信方式来讲,XMPP的优势最为明显。
首先,XMPP能实现双向推送。当然,WebService从实际的用途上来讲,也可以实现PUSH,但前提是,它只能作为单向的PUSH,并不能作为那种类似P2P模式的方式。如果WebService要实现这种方式,也可以采用客户端轮询的方式。Twritter的实践证明,如果采用轮询的方式,会导致服务器无法处理大量的并发请求。
其次,安全性强。XMPP构建在TLS和SASL技术之上,它们为XMPP连接提供了牢固的加密和安全功能。
最后,XMPP拥有强大的工具箱,集中表现在三种不同的工具(Presence,Message,IQ)以及将近300中扩展。
二、XMPP协议体
XMPP协议的传输方式是基于XML流的方式进行传输的。Jabber为满足业务的需求,为其制定了许多通信格式,目前这些格式已被IETF国际标准组织完成了标准化工作。
从体系架构上看,XMPP定义三个角色,客户端,服务器和网关。网关相当于现实中的交换机,负责与其它既是通信网路的互联互通。而服务器好比一个路由器,承载着客户端的所有信息记录和信息路由的功能,类似我们常见的SaaS的部署方式。通过这种通信协议可以使得通信能够在这三者的任意两个之间双向发生。体系结构如图1-1:
图1-1 XMPP体系架构
XML定义了三种XML节,分别为iq,message和presence。
三、协议节点分析
分析以上节点,让我们来深入了解下这些协议是怎么制定出来的。首先我们先从最初的协议体Packet。Packet,英文翻译为包,即XMPP传输协议体。Packet中包含以下几个方法:
from:从什么地方来,方法名为:getFrom();
to:从什么地方去,方法名为:getTo();
Elment:元素节点。
Type:IQ协议体类型。
实现方式如下:
(1)、使用DOM4J编写出一个XML节点,具体方式如下:
//写入数据到内存中
StringWriter out = new StringWriter();
XMLWriter writer = new XMLWriter(out, OutputFormat.createPrettyPrint());
//将数据输出到节点中
writer.write(this.element);
(2)、设置ID。发送ID值到客户端,保证服务端当前IQ包的IQ和客户端IQ包的ID 是一致的。具体方式如下:
//设置随机函数
private static Random random = new Random();
Id的算法如下:
Int sequence=0;
random.nextInt(1000) + "-" + sequence++;
(3)组合方式为:
(4)发送包体:
//使用路由分发功能
PacketRouter router = XMPPServer.getInstance().getPacketRouter();
reply.setChildElement(((IQ) packet).getChildElement().createCopy());
//发送包体信息
router.route(packet);