XMPP协议体的研究及实践

本文介绍了XMPP协议的基本概念及其在即时通讯领域的应用。XMPP是一种基于XML的实时通信技术,支持双向推送和强大的安全功能。文章还详细分析了XMPP协议的组成结构,包括消息(message)、请求(iq)和状态(presence)等核心组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XMPP协议体的研究及实践
发布者:JECON
一、XMPP协议简介
     

       XMPP,即可扩展消息处理现场协议,是一种实时通信的开发技术。它使用XML作为基底格式的交换信息。从本质上来讲,XMPP提供了一种方法,使得一个实体与另一个实体的通信接近实时,即使网络延迟,它也能快速的将信息发送到对方,不因产生发送方网络中断而导致的一系列问题。

       从业务体系上来讲,它的实时在于在线的即时和离线的即时两种的业务。在线的即时,用户在线时,立即推送。离线的即时,当接受方下次上线的时候可以接收到发送方发送的信息。就像我们往常使用的QQ,如果用户选择了离线发送,那么即使对方隐身和离线,都能接收到推送过来的数据信息。

  相比之下,与我们曾经使用过的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。
  <message/>节定义了消息的语义,作为一种特定的消息体,传输的数据方式为消息体,也就是我们常说的报文。这种方式一般用在通过服务端验证以后返回的具体数据的报文发送。
  <iq/>节定义了请求的语义,被看作成一个请求-响应机制,与HTTP在某些方面相似。请求与响应的数据内容由IQ元素的直接子元素作命名空间的声明并且交互由请求实体通过“id”属性来跟踪。而id的属性则是根据服务端返回的ID决定。
  <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)组合方式为:
<iq type='result' id='reg1'></iq>
(4)发送包体:
//使用路由分发功能
PacketRouter router = XMPPServer.getInstance().getPacketRouter();
reply.setChildElement(((IQ) packet).getChildElement().createCopy());
//发送包体信息
router.route(packet);






  
  
  

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值