http://hi.baidu.com/luciferpm/blog/item/f6c018d35a19aad9562c8465.html
1. 介绍
Jabber是一个由开源社区发起并领导开发的即时消息和在线状态的系统。Jabber系统和其它即时消息(IM)服务的一个功能上的差别在于Jabber拥有开放的XML协议。在保持Jabber1.0版本有关消息核心以及在线状态的协议的基础上,增加了一些必要的扩展。本文档将对Jabber服务器1.4版的Jabber协议进行介绍。
在XML上下文的数据流中,Jabber开放的XML协议包括三个顶级XML元素:
l <message/>
l <presence/>
l <iq/>(info/query)
每一个元素通过属性和名字空间包含大量的数据,这些属性和名字空间都是Jabber的组成部分(但不包括为特殊应用的名字空间应用)。下面将描述整个Jabber协议。如果您想获得关于Jabber系统结构的信息,请查看名为Jabber技术概述的文档(http://docs.jabber.org/general/html/overview.html)。
2. XML流
一个Jabber会话由两个平行的XML流组成,一个从客户端到服务器端,另一个从服务端到客户端。当一个Jabber客户端连接上一个Jabber服务器时,这个客户端将发起一个客户端-服务器的XML流,同时作为响应,服务器也将发起一个服务器-客户端的XML流。所有<message/>,<presence/>,以及<iq/>元素都被放在这些XML流的上下文中。下面就有一个例子:
SEND:<?xml version=”1.0” encoding=”UTF-8” ?>
SEND:<stream:stream
SEND:to=’jabber.org’
SEND:xmlns=’jabber:client’
SEND:xmlns:stream=’http://ether.jabber.org/streams’>
RECV:<stream:stream
RECV:xmlns:stream=’http://etherx.jabber.org/streams’
RECV:id=’39ABA7D2’
RECV:xmlns=’jabber:client’
RECV:from=’jabber.org’>
(XML for user session goes here)*
SEND:</stream:stream>
RECV:</stream:stream>
*注意:必须等到当一个<iq/>元素(特别指一个’jabber:iq:auth’名字空间下的<query/>元素)发送了认证信息后,服务器才会同意用户会话进行工作。
3. <message/>元素
<message/>元素是Jabber开放XML协议三个顶级元素中的一个。它被用来包含两个Jabber用户间互相发送消息内容,或者两个Jabber IDs之间更一般的消息(因为,通过神奇的传输器,另一个IM系统可以用Jabber ID代替,如[email protected])。
3.1. 消息类型-“type”属性
Jabber支持几种不同的消息,这些消息通过<message/>的“type”属性来进行区分。下面就是“type”属性的有效值:
3.1.1. [default](不设置“type”属性)
表示本消息是一个普通消息。默认的情况下,客户端在没有设置属性时,将消息类型定为普通消息。
例子:
<message to="[email protected]/orchard">
<body>Wherefore art though Romeo?</body>
</message>
3.1.2.type=”chat”
表示消息需要被一个接一个的显示在聊天界面上(一般是一条接一条的界面,不过实际界面可以被用户自己定义。)
例子:
<message to="[email protected]/orchard" type="chat">
<body>Wherefore art though Romeo?</body>
</message>
3.1.3.type=”error”
表示消息被描述成一个错误条件。实际的错误在消息中用一个<error/>元素来描述。一个<message/>元素包括一个<body/>和一个<error/>。下面的例子将演示,当Juliet对一个不存在的用户发送一个“hi”的消息时,将收到的包体:
例子:
<message
to="[email protected]"
from="[email protected]"
type="error">
<body>hi</body>
<error code="404">Not Found</error>
</message>
3.1.4. type=”groupchat”
表示本消息需要在一个聊天室的界面中进行显示。
例子:
<message to="[email protected]" type="groupchat">
<body>Double, double toil and trouble</body>
</message>
3.2. <message/>其它属性
除了设置“type”属性,还可以通过下面的属性修改<message/>元素:
3.2.1. “from”属性
消息发送者的标志。总得来说,Jabber ID的”from”必须是user@host/resource的格式。从XML的观点来说,这个属性必须包含于所有的<message/>元素中,为了对付一些欺骗,实际应用中服务器添加或置换这个属性。因此,它并不是客户端开发者需要关心的问题。
例子:
<message from="[email protected]/balcony">
<body>Wherefore art thou Romeo?</body>
</message>
3.2.2. “id”属性
“id”属性是作为消息的一个唯一标志。它由Jabber客户端或客户库(类似WinJab或JabberCOM),生成,客户端用它来为跟踪消息(比如将发送到一个群组聊天室的信息和从这个聊天室收到的消息相关联,或将一个消息与它可能产生的错误相关联)进行标识。“id”属性是可选的,并且在系统的别的方是不可用的。
例子:
<message to="[email protected]/orchard" id="JCOM_85">
<body>Wherefore art thou Romeo?</body>
</message>
3.2.3. “to”属性
表示消息的接收者。Jabber ID的“to”属性一般是user@host/resource格式,user@host也可以被接受。如果接收者在线,通过user@host/resource方式解决,如果用户不在线,直接发送离线存储器。这个属性是所有<message/>元素必须的。
例子:
<message to="[email protected]/orchard">
<body>Wherefore art thou Romeo?</body>
</message>
3.3. <message/>中的子元素
下面的子元素是用来定义一个Jabber消息的上下文或数据元。
3.3.1. <body/>
这个元素包含消息的主要文本。<body/>元素只存在于一个<message/>元素中,并且只能包含明文。不过,它可以由其它子元素构成(如<error/>、<x/>)。
3.3.2. <error/>
当消息类型属性被置为“error”时,这个元素将被使用。错误代码被一个”type”属性定义,这个”type”属性包含代码数,通过<error/>元素来包含一个这个错误的文本描述。<error/>元素必须包含在原始消息的<body/>中。下面的例子将演示,当Juliet向一个不存在的用户发送“hi”消息后的包体:
例子:
<message
to="[email protected]"
from="[email protected]"
type="error">
<body>hi</body>
<error code="404">Not Found</error>
</message>
附文中有非法代码与它们所定义的含义表。
3.3.3. <html/>
<html/>元素结合XHTML名字空间(http://www.w3.org/1999/xhtml),为一个消息提供一个交替的名字空间,就像在email世界中规定同时发送普通文本与HTML版本的邮件消息一样。这个功能使用的是W3C开发的基本XHTML格式(http://www.w3.org/TR/xhtml-basic/),关于Jabber在消息中的XHTML执行细节,请看Jabber消息的暂定格式规范(http://docs.jabber.org/draft-proto/html/xhtml.html)。所有XHTML的根元素都必须是<html xmlns=”http://www.w3.org/1999/xhmtl”></html>。这个根元素中,支持任何一个基本XHTML格式中定义的元素,但不是每一个元素可以通过即时消息的上下文来进行理解。
3.3.4. <subject/>
这是一个可选元素,包含消息的标题。
3.3.5. <thread/>
当一个Jabber客户端发送一个”chat”类型的消息,将生成唯一的线程ID(通常是由发送者的Jabber ID和当前时间生成的一个hash)。消息发送者和接收者在聊天中后续的消息都包含一个<thread/>子元素,这个子元素包含原始线程ID。这使得消息发送者和接收者对回复进行认证并创建一个对话线程。下面的是例子:
<message
from="[email protected]/balcony"
to="[email protected]/orchard"
type="chat">
<thread>AAC96FEFDE226C2C04BE8F2E19A2151B</thread>
<body>Art thou not Romeo and a Montague?</body>
</message>
<message
from="[email protected]/orchard"
to="[email protected]/balcony"
type="chat">
<thread>AAC96FEFDE226C2C04BE8F2E19A2151B</thread>
<body>Neither, fair saint, if either thee dislike.</body>
</message>
3.3.6. <x/>
<x/>元素作为一个扩展机制来使用,或发送从服务器发送命令给客户端,或从一个客户端发送命令到另一个客户端。每次用到这个元素时,必须指明相关的XML名字空间。单一消息可以包含多个<x/>子元素实例。下列已定义的名字空间可以被<x/>子元素使用:
l jabber:x:autoupdate
l jabber:x:delay
l jabber:x:encrypted
l jabber:x:oob
l jabber:x:roster
这些名字空间在下面的Jabber名字空间中被更完整地描述。
下面是一个使用jabber:x:delay名字空间在加入的群组聊天室的显示上下文的例子:
<message
type=’groupchat’
from=’[email protected]’>
<body>Thrice the brinded cat hath mew’d.</body>
<x xmlns=’jabber:x:delay’
stamp=’10541031T21:43:40’>Cached In GC History</x>
</message>
|