Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31659
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-13 23:43
个人简介

个人发展路线: 面向终端的移动架构路线,包括用户体验的研究,终端架构的分析及终端底层设计。 个人介绍: 目前从事Android应用系统框架研发以及即时通信软件研发。

文章分类

全部博文(5)

文章存档

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构建在TLSSASL技术之上,它们为XMPP连接提供了牢固的加密和安全功能。

最后,XMPP拥有强大的工具箱,集中表现在三种不同的工具(Presence,Message,IQ)以及将近300中扩展。

二、XMPP协议体

XMPP协议的传输方式是基于XML流的方式进行传输的。Jabber为满足业务的需求,为其制定了许多通信格式,目前这些格式已被IETF国际标准组织完成了标准化工作。

从体系架构上看,XMPP定义三个角色,客户端,服务器和网关。网关相当于现实中的交换机,负责与其它既是通信网路的互联互通。而服务器好比一个路由器,承载着客户端的所有信息记录和信息路由的功能,类似我们常见的SaaS的部署方式。通过这种通信协议可以使得通信能够在这三者的任意两个之间双向发生。体系结构如图1-1

1-1 XMPP体系架构

XML定义了三种XML节,分别为iqmessagepresence

节定义了消息的语义,作为一种特定的消息体,传输的数据方式为消息体,也就是我们常说的报文。这种方式一般用在通过服务端验证以后返回的具体数据的报文发送。

节定义了请求的语义,被看作成一个请求-响应机制,与HTTP在某些方面相似。请求与响应的数据内容由IQ元素的直接子元素作命名空间的声明并且交互由请求实体通过“id”属性来跟踪。而id的属性则是根据服务端返回的ID决定。

节定义了状态的语义,被看作成一个基本的消息-订阅者。多种实体可以收到状态的信息。从整体上来说,这种方式一般被用于表示实体的状态信息。

三、协议节点分析

分析以上节点,让我们来深入了解下这些协议是怎么制定出来的。首先我们先从最初的协议体PacketPacket,英文翻译为包,即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);

       

     

         

 

阅读(2222) | 评论(0) | 转发(0) |
0

上一篇:Hadoop和大数据时代

下一篇:C++学习路线

给主人留下些什么吧!~~