- 浏览: 143819 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
gadmyth:
beta reduction也介绍错了(λx . e)f →β ...
Lamda演算简介 -
gadmyth:
左结合法则是错的,因为Application binds mo ...
Lamda演算简介 -
hongmeikaile:
...
Struts2与ajax的组合 -
aguai0:
非常详细,学习了
prototype-1.3.1.js 开发笔记 -
左看右看:
...
DAO编程模式(转)
Jabber 协议 概述
Peter Saint-Andre
stpeter@jabber.org
1.4版Jabber服务协议的概述
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代替,如70902454@icq.jabber.org)。
3.1. 消息类型-“type”属性
Jabber支持几种不同的消息,这些消息通过<message/>的“type”属性来进行区分。下面就是“type”属性的有效值:
3.1.1. [default](不设置“type”属性)
表示本消息是一个普通消息。默认的情况下,客户端在没有设置属性时,将消息类型定为普通消息。
例子:
<message to="romeo@montague.net/orchard">
<body>Wherefore art though Romeo?</body>
</message>
3.1.2.type=”chat”
表示消息需要被一个接一个的显示在聊天界面上(一般是一条接一条的界面,不过实际界面可以被用户自己定义。)
例子:
<message to="romeo@montague.net/orchard" type="chat">
<body>Wherefore art though Romeo?</body>
</message>
3.1.3.type=”error”
表示消息被描述成一个错误条件。实际的错误在消息中用一个<error/>元素来描述。一个<message/>元素包括一个<body/>和一个<error/>。下面的例子将演示,当Juliet对一个不存在的用户发送一个“hi”的消息时,将收到的包体:
例子:
<message
to="juliet@capulet.com"
from="flomeo@montague.net"
type="error">
<body>hi</body>
<error code="404">Not Found</error>
</message>
3.1.4. type=”groupchat”
表示本消息需要在一个聊天室的界面中进行显示。
例子:
<message to="cauldron@conference.witches.org" 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="juliet@capulet.com/balcony">
<body>Wherefore art thou Romeo?</body>
</message>
3.2.2. “id”属性
“id”属性是作为消息的一个唯一标志。它由Jabber客户端或客户库(类似WinJab或JabberCOM),生成,客户端用它来为跟踪消息(比如将发送到一个群组聊天室的信息和从这个聊天室收到的消息相关联,或将一个消息与它可能产生的错误相关联)进行标识。“id”属性是可选的,并且在系统的别的方是不可用的。
例子:
<message to="romeo@montague.net/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="romeo@montague.net/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="juliet@capulet.com"
from="flomeo@montague.net"
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="juliet@capulet.com/balcony"
to="romeo@montague.net/orchard"
type="chat">
<thread>AAC96FEFDE226C2C04BE8F2E19A2151B</thread>
<body>Art thou not Romeo and a Montague?</body>
</message>
<message
from="romeo@montague.net/orchard"
to="juliet@capulet.com/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=’cauldron@conference.witches.org’>
<body>Thrice the brinded cat hath mew’d.</body>
<x xmlns=’jabber:x:delay’
stamp=’10541031T21:43:40’>Cached In GC History</x>
</message>
4. <presence/>元素
<presence/>元素提供关于一个Jabber实体的可用性信息。任何一个通过一个Jabber ID确认的实体可以与另一个实体进行在线状态信息的通信,这种通信大多以订阅在线状态信息的方式进行。
所有实体表现出的在线状态不是“可用”就是“不可用”。“可用”状态表示发送者可以立即收到消息。“不可用”状态表示发送者不能在当前时间收到任何数据。默认情况下,所有<presence/>元素除非包含type=”unavailable”属性外,都表示“可用”。“可用”的更多特殊形势通过<status/>和<show/>子元素进行指定。
4.1. “type”属性
<presence/>的“type”属性根据不同目的使用。除了提示其它用户本用户的可用性状态的“普通”用法外,还包括订阅、取消订阅、以及探测在线状态信息。下面是“type”属性的可用值:
4.1.1. type=”available”
如果没有包含任何“type”属性,在线状态包将被设为type=”available”,用来提供用户在线时的信息。一个type=”available”的在线状态包通常包含一个<show/>元素以详细说明Jabber实体的可用类型,以及一个<status/>元素,该元素包含人能看懂的关于该可用类型的描述。在线状态包还可以包含一个<priority/>元素,来指明该连接的Jabber ID的优先级。
例子:
<presence
from="juliet@capulet.com/balcony"
to="romeo@montague.net/orchard"/>
<show>away</show>
<status>Stay but a little, I will come again.</status>
</presence>
<show/>元素的可用值为:
l away――Jabber用户或实体在线,但不能马上联系上
l chat――Jabber用户或实体在线并有兴趣聊天
l dnd――Jabber用户或实体在线,但不想被打扰(“dnd”表示“do not disturb”)
l xa――Jabber用户或实体在线,但已经离开很长时间了(“xa”表示“extended away”)
<status/>可以包含任意特性数据,这些数据通常包含对于用户状态的描述,如,“开会中”是“away”的一个表现值,或者“忙于编码”可以是“dnd”的一个表现。
4.1.2. type=”error”
当一个在线状态包发送给一个不存在的JID时,或在发送在线状态请求时发生一个错误时,服务器都将返回一个type=”error”的在线状态包。
下面是一个例子(注意域名的类型):
<presence
type="subscribe"
to="romeo@montague.nett"/>
回复的例子:
<presence
from="romeo@montague.nett"
to="juliet@capulet.com/balcony"
type="error">
<error code=’504’>Remote server timeout. Unable to deliver
packet.</error>
</presence>
4.1.3. type=”probe”
向一个特定实体(实体不能发送在线状态消息给自己)发出在线状态信息请求。服务器而非客户端,进行一个探测请求。实际上,虽然Jabber客户端也可以发送一个探测一个指定Jabber用户是否在线的请求,但通常都是服务器端发出探测请求。注意,只有在发起请求的用户在请求所对应的用户的花名册上,并且拥有“from”或“both”订阅类型时,服务器才会发出探测请求。在下面的例子中,我们将看到我们的英雄Romeo向Juliet发出一个探测请求,Juliet所在服务器回复一个“状态报告包”(包含jabber:x:delay名字空间中指明的上次在线状态更新的时间戳)
探测请求的例子:
<presence
from="romeo@montague.net"
to="juliet@capulet.com"
type="probe"/>
回复探测请求的例子:
<presence
from="juliet@capulet.com/."
to="romeo@montague.net">
<status>Stay but a little, I will come again.</status>
<show>away</show>
<x
xmlns="jabber:x:delay"
from="juliet@capulet.com/."
stamp="15310309T23:47:15"/>
</presence>
4.1.4. type=”subscribe”
发送一个请求,这个请求是接收者在其在线状态改变时,自动发送在线状态信息给发送者。
例子:
<presence
from="romeo@montague.net"
to="juliet@capulet.com"
type="subscribe"/>
4.1.5. type=”subscribed”
发送一个消息,表明发送者接受了接受者对其再现状态订阅的请求。从现在起,当发送者的在线状态信息改变时,服务器将会把状态信息发送给接收者。
例子:
<presence
from="juliet@capulet.com"
to="romeo@montague.net"
type="subscribed"/>
4.1.6. type=”unavailable”
例子:
<presence
from="juliet@capulet.com"
to="romeo@montague.net"
type="unavailable">
<status>Disconnnected</status>
</presence>
4.1.7. type=”unsubscribe”
发送一个请求,表明接收者停止发送在线状态信息给发送者。
例子:
<presence
from="juliet@capulet.com"
to="romeo@montague.net"
type="unsubscribe"/>
4.1.8. type=”unsubscribed”
这种类型的在线状态包有两个用途:
1. 发送一个表明发送者接受接收者关于不订阅其在线状态信息的请求的通知。服务器将不再发送发送者的在线状态信息给接收者。
2. 拒绝一个订阅请求。服务器将不再发送发送者的在线状态信息给试图订阅其在线状态信息的用户。
例子:
<presence
from="romeo@montague.net"
to="juliet@capulet.com"
type="unsubscribed"/>
4.2. 其它<presence/>属性
除了设置“type”属性,还可以通过下列属性修改<presence/>元素:
4.2.1. “from”属性
标识在线状态包的发送者。一般Jabber ID再“from”属性中必须写成user@host/resource的格式。从XML的观点来说,这个属性是所有<presence/>元素所必须的,而在实际应用中,都是服务器对该属性进行添加和修改(防止一些欺骗的手段),因此客户端开发者不需要考虑它。
例子:
<presence from="juliet@capulet.com/balcony"/>
4.2.2. “id”属性
为在线状态请求包配置唯一的验证符。“id”属性由Jabber客户端或客户库(如Gabber或JabberCOM)生成,客户端用其为在线状态包的轨迹进行验证。“id”属性是可选的,并且不能用于系统其它任何地方。
例子:
<presence to="romeo@montague.net/orchard" id="JCOM_86"/>
4.2.3. “to”属性
标识在线状态包的接收者。一般Jabber ID在“to”属性中都是user@host/resource的格式,user@host的格式也是可以的,但当接收者在线时,它将转化为user@host/resource。在Jabber的一般用法中,Jabber客户端向服务器发出在线状态包,服务器将这些在线状态包发送到该用户花名册上所有的用户。当一个Jabber客户端发送的<presence/>元素中不含“to”属性时,服务器将将其转化为在线状态包发送给指定的Jabber实体。下面的例子将演示这一过程。
发送给服务器的在线状态的例子:
<presence>
<status>Stay but a little, I will come again.</status>
<show>away</show>
</presence>
服务器发给指定用户的在线状态例子:
<presence
to="romeo@montague.net/orchard"
from="juliet@capulet.com/balcony">
<status>Stay but a little, I will come again.</status>
<show>away</show>
</presence>
4.3. <presence/>的子元素
下面的元素用于<presence/>协议。
4.3.1. <priority/>
在Jabber中,根据Jabber知道的设备数或位置数,一个用户可以建立相同数量的连接。用户可以给每一个资源赋予一个数字优先级(通过对指派给该资源的Jabber客户端进行设置),这个优先级与<presence/>元素的子元素<priority/>方法进行通信。
当在线状态包发送到服务器后,服务器有能力决定哪一个连接资源需要指派一个单一的Jabber ID,该资源将收到发往该Jabber ID的消息,这是因为数字最高的资源是默认或第一资源。如果最高优先级的资源不可用,消息和其它Jabber通信将发送给次高优先级的资源(当其它资源都不可用时,一个没有从默认数到0的优先级的客户端,也可以成为第一资源)
举例来说,Julie可以通过两个资源:the balcony 和 the chamber连接她的帐号juliet@capulet.com。如果“balcony”资源的优先级被设置为“2”,而“chamber”资源的优先级被设为“1”,而且两个资源都可以连接,消息将发送到juliet@capulet.com/balcony,而不是juliet@capulet.com/chamber。
4.3.2. <show/>
可选的<show/>元素告诉Jabber客户端如何显示一个用户的在线状态。<show>标签是一个典型的<status>标签的伴随标签,<status>标签包含更多在线状态改变理由的描述信息。如果<show/>元素不在<presence/>元素中,Jabber接收客户端将指明该用户处于“普通”状态。下面是四个可选项:
标签
含义
<show>chat</show>
该客户可以马上联系上
<show>away</show>
该客户在线,但刚刚离开(如吃午饭,开会)
<show>xa</show>
该客户在线,但已经处于非活动状态很长时间了。
<show>dnd<show>
该用户处于谢绝打扰的模式
4.3.3. <status/>
<status/>元素包含更多关于用户在线状态的描述。大多数Jabber客户端都包含一些<status/>元素的默认设置;另外,它们还允许我们提供富有个性的描述如“我在吃午饭”或者“钓鱼中”。
4.3.4. <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名字空间中被更完整地描述。
5. <iq/>元素
信息/查询(IQ)在Jabber中在两个实体间构建一个根本的会话,并且允许实体间来回传送XML格式的请求和响应。信息/查询主要的用处是取得或设置公共的用户信息,比如名字,电子邮件,地址等等。但它的灵活设计使得任何种类的会话都可以发生。任何通过一个Jabber ID标识的实体都能通过一个IQ与其它实体进行会话。
5.1. “type”属性
<iq/>元素的“type”属性用于决定信息/查询是请求还是响应。下面是“type”属性的可用值:
5.1.1. type=”error”
表示查询失败。实际错误在<iq/>元素的<error/>子元素中描述。
例子:
<iq type="error" to="romeo@montague.net">
<error code="403">Forbidden</error>
</iq>
5.1.2. type=”get”
找回指派给一个查询名字空间的信息。如果没有设置属性,默认情况,这个属性包含在查询中。一个type=”get”的<iq/>元素由一个子元素构成,这个子元素通常是<query>,但也可以是<vcard/>或另一个已有的子元素。不过,指定的子元素必须左空,以便接收一个用户所需提供的信息的空间的清单。一个成功的get查询的结果type=”result”的<iq/>元素,是元素嵌套在包含了所需信息的指定子元素(如<query>或<vcard/>)。
例子:
<iq type="get">
<vCard xmlns="vcard-temp"/>
</iq>
5.1.3. type=”result”
表示<iq/>包是一个type=”get”或type=”set”的<iq/>查询的成功响应。这个成功查询的结果是一个type=”result”的<iq/>元素,该元素嵌套在一个包含所查询的信息的子元素中(如<query>、<vcard/>)。一个成功的查询或获取查询结果的返回是一个空的type=”result”的<iq/>元素。一个不成功的返回是一个type=”error”的<iq/>元素。<iq type=”result”/>通常与“id”属性的获取、设定查询有关。
例子:
<iq type="result">
<vCard version="3.0" xmlns="vcard-temp">
vCard data goes here
</vCard>
</iq>
5.1.4. type=”set”
表示<iq/>包是对设值或更改现有数据值。一个type=”set”的<iq/>元素总是包含一个指定的子元素,通常是<query>,也可以是<vcard/>或者其它可以接受的子元素。一个设置命令查询的成功返回是一个空的type=”result”的<iq/>元素。
例子:
<iq type="set">
<vCard version="3.0">
vCard data goes here
</vCard>
</iq>
5.2. 其它<iq/>属性
除了“type”属性外,IQ元素还可以通过下面的属性进行修改。
5.2.1. “from”属性
表示iq包的发送者。从XML观点来说,这个属性是所有<iq/>元素所必须的,实际应用中这个属性是服务器来增加和修改的(为防止某些欺骗),因此客户端的开发人员不需要过多关注这个属性。
例子:
<iq from="romeo@montague.net"/>
5.2.2. “id”属性
一个iq包只有唯一的标识。Jabber客户端或客户库生成“id”属性,客户端通过它来标识<iq/>包,以完成对<iq/>包的跟踪(如:一个type=”result”对应一个type=”get”或type=”set”)。“id”属性是可选的,并且不能用于系统的其它地方。
例子:
<iq type="get" from="juliet@capulet.com/balcony" id="JCOM_87"/>
<iq type="result" to="juliet@capulet.com/balcony" id="JCOM_87"/>
5.2.3 “to”属性
表示iq包的接收者。在Jabber客户端,对应“to”属性的Jabber ID的格式为user@host/resource。user@host也是可以的,如果用户在线,user@host将被置换成user@host/resource,如果用户不在线,user@host将被直接指向一个离线模块(对于类似服务器端网关这种非用户实体,情况又有所不同,因为它们不拥有资源,并且只是简单通过Jabber ID的一个“server”端口进行标识。Jud.jabber.org——Jabber用户目录就是这样一个例子)。如果<iq/>包没有<to>属性,服务器将对该包进行处理。
例子:
<iq to="juliet@capulet.com/balcony">
5.3 <iq/>的子元素
下面介绍<iq/>元素的子元素。
5.3.1. <error/>
当iq的属性类型被设置为“error”时,将用到本属性。错误代码根据一个含有错误数的“type”属性进行定义,<error/>员司包含该错误的文本描述。比如,下面就是一个坏请求:
<error code="400">Bad Request</error>
在附录中,列有错误编码及其对应的错误描述。
5.3.2. <key/>
<key/>元素为客户端-服务器之间交互提供一层安全保护。它被用户jabber:iq:register和jabber:iq:search名字空间中。
当一个客户端发起一个与服务其之间的交互时,服务器将发送一个包含一个唯一值的<key>给客户端。客户端在返回<iq type=”set”/>的消息中,包含上诉唯一值到<key/>子元素中。这样,服务器就认为该客户端时接收到原来密码的同一实体。
5.3.3. <query/>
<iq/>元素中的<query/>子元素定义所执行的查询的类型。特殊情况下,查询可以拥有一个特殊的名字空间,这个名字空间是一个通过“xmlns”属性定义的<query/>子元素。一个<iq/>元素中只能有一个<query/>子元素。
下面的例子是当我通过我的Linux机器上的Grabber客户端登陆到服务器上,将出现的XML。
<iq type="set">
<query xmlns="jabber:iq:auth">
<username>stpeter</username>
<resource>Gabber</resource>
<digest>f1e881517e9917bb815fed112d81d32b4e4b3aed</digest>
</query>
</iq>
就象你看到的那样,认证查询通过客户端认证名字空间(jabber:iq:auth)向服务器发送认证信息。一般,Jabber核心协议保留jabber:iq:*这样的名字空间。而开发者可以通过增加jabber:iq:*名字空间对Jabber核心进行扩展。这些将在下面的名字空间中进行更完整的描述。
一个空<query/>子元素可以与<iq type=”get”>元素一起发送,这样可以找回与<query/>子元素中指定的名字空间相关的一个Jabber实体的信息。比如,找回一个客户端的花名册(“联系人名单”),下面的XML可以被发送:
<iq to="juliet@capulet.com/balcony" type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
6. 名字空间
现面是Jabber中的标准名字空间:
l jabber:iq:agent——代理工具
l jabber:iq:agents——有效的代理组
l jabber:iq:auth——简单用户认证
l jabber:iq:autoupdate——版本更新申请
l jabber:iq:browse——Jabber浏览
l jabber:iq:conference——一般会议
l jabber:iq:gateway——用户地址网关
l jabber:iq:last——上次使用时间
l jabber:iq:oob——绑定数据输出
l jabber:iq:private——私有数据存储
l jabber:iq:register——注册请求
l jabber:iq:roster——花名册(联系人名单)管理
l jabber:iq:search——用户数据库查询
l jabber:iq:time——客户端时间
l jabber:iq:version——客户端版本
l jabber:x:autoupdate——版本通知申请
l jabber:x:conference——会议邀请
l jabber:x:delay——显示的对象
l jabber:x:encrypted——加密的消息
l jabber:x:envelope——消息封套
l jabber:x:event——消息事件
l jabber:x:expire——消息终止
l jabber:x:oob——绑定数据(文件传输)输出
l jabber:x:roster——内部的花名册条目
l jabber:x:signed——标记的在线状态
l vcard-temp——临时的vCard
下面将详细介绍这些名字空间的细节。
6.1. jabber:iq:agent——代理工具
代理工具名字空间包含一个代理的所有工具。jabber:iq:angents查询通常用于注册到一个指定的服务、代理、传输器。
它也可能检验一个指定代理的所有工具细节。比如,一个客户端可以决定一个开放的注册是否可以进行。
例子:
<iq id="wjAgent" type="result" from="Jabber.org">
<query xmlns="jabber:iq:agent">
<agent jid="aim.jabber.org">
<name>AIM Transport</name>
<description>This is the AIM Transport</description>
<transport>AIM/AOL ScreenName</transport>
<service>aim</service>
<register/>
</agent>
</query>
</iq>
6.2. jabber:iq:angents——可用的代理列表
可用代理列表名字空间包含一组实体,这些实体拥有一些特殊工具,并能够为另一个实体提供服务。大多数情况下,可用代理列表是用来显示一台服务器上的可用传输器列表。
注意:这个名字空间被jabber:iq:browse的支持者所反对(??)。
例子:
<iq id="wjAgents" type="result" from="jabber.org">
<query xmlns="jabber:iq:agents">
<agent jid="users.jabber.org">
<name>User Directory</name>
<description>
You may register and create a public searchable
profile, and search for other registered Jabber
users.
</description>
<service>jud</service>
<register/>
<search/>
</agent>
<agent jid="aim.jabber.org">
<name>AIM Transport</name>
<description>This is the AIM Transport</description>
<transport>AIM/AOL ScreenName</transport>
<service>aim</service>
<register/>
</agent>
</query>
</iq>
6.3. jabber:iq:auth——简单客户端认证
简单客户认证名字空间是对客户端进行认证的一个简单机制,它为客户端到服务器之间的连接创建一个资源。
认证成功返回一个type=”result”的IQ响应。不成功,就返回一个错误IQ元素。
如果没有发送名字空间或密码,如果服务器允许,服务器将创建一个匿名资源。
例子:
<iq type="set" id="JCOM_0">
<query xmlns="jabber:iq:auth">
<username>juliet</username>
<password>secret</password>
<resource>balcony</resource>
</query>
</iq>
<iq type="set" id="JCOM_0">
<query xmlns="jabber:iq:auth">
<username>juliet</username>
<digest>a5e052c48c455bf21d937ccf17225916d9486b09</digest>
<resource>balcony</resource>
</query>
</iq>
<iq type="set" id="JCOM_0">
<query xmlns="jabber:iq:auth">
<username>juliet</username>
<hash499>secret</hash499>
<resource>balcony</resource>
</query>
</iq>
6.4. jabber:iq:autoupdate——版本更新申请
版本更新申请名字空间允许客户端对所有可用软件更新进行申请请求。
例子:
<iq type="get" to="jabber.org" id="1">
<query xmlns="jabber:iq:autoupdate"/>
</iq>
6.5. jabber:iq:browse——Jabber浏览
Jabber浏览名字空间的作用是,一是为Jabber世界中已有的Jabber IDs增加结构的一个途径,一是发现为不同Jabber实体提供的服务或应用。一个Jabber浏览的基本概念就是一个jid-type(类似文件的一个模拟类型的概念)。下面是想象中的最高级别的jid-types,不过随着时间的推移,一些其它的逻辑将被增加进来:
l 应用
l 会议
l 标题
l 关键字
l 回报
l 服务
l 用户
上面每一个范畴都有一个子类列表,如用户/客户端,或用户/设备(“客户端”或“设备”只是一个“资源”的概念),会议/irc,服务/icq,标题/库存。一般的,通过使用jabber:iq:browse名字空间你将拥有一个与上述某一jid-type范畴相对应的元素,这个元素通常有一个指定子类型的“type”属性。
Jabber:iq:browse的一个用户就是代替jabber:iq:agents名字空间来列出一个服务器上所对应的代理或其它服务。下面是一个浏览服务器的例子:
Jabber客户端发送:
<iq type="get" to="jabber.org">
<query xmlns="jabber:iq:browse"/>
</iq>
Jabber服务器返回:
<iq type="result" from="jabber.org">
<service
type="jabber"
jid="jabber.org"
xmlns="jabber:iq:browse>
<service
type="jud"
jid="users.jabber.org"
name="Jabber User Directory">
<ns>jabber:iq:register</ns>
<ns>jabber:iq:search</ns>
</service>
<service
type="aim"
jid="aim.jabber.org"
name="AIM Transport">
<ns>jabber:iq:register</ns>
<ns>jabber:iq:search</ns>
</service>
<conference
type="private"
jid="conference.jabber.org"
name="Private Chatrooms">
</service>
</service>
</iq>
在会议中的一个例子:
<iq type="set" to="room@server">
<conference xmlns="jabber:iq:browse" name="Room Name">
<user jid="room@server/jidhash" name="nick1"/>
<user jid="room@server/jidhash" name="nick2"/>
</conference>
</iq>
6.6. jabber:iq:conference——一般会议
一般会议名字空间提供一个会议室的机制(如群组聊天室),并提供该会议室的入口。这个名字空间与</iq>元素配套使用来获得一个会议室的信息,包括要求加入这个会议室的请求信息,以及为这个会议室设置信息(通常是为了加入这个房间)。一个普通进入房间的请求将和下面的类似:
1. 想要加入的房间提交一个type=”get”的请求。这个XML将是下面的形式:
<iq type="get" to="room@server">
<query xmlns="jabber:iq:conference"/>
</iq>
2. 接受来自要加入的房间的type=”result”的iq响应,其中有进入房间所需要的参数。这个XML将是下面的形式:
<iq type="result" from="room@server">
<query xmlns="jabber:iq:conference">
<nick/>
<secret/>
<privacy/>
<name>Room Name</name>
</query>
</iq>
这里所有的请求元素的子元素都是可选的。昵称(nickname)元素表示进入房间需要一个昵称。密钥(secret)元素表示进入房间的用户需要提供一个密码。独处(privacy)元素表示如果用户在一个type=”set”(下面可以看到例子)的iq包中提供这样的元素,会议服务器将隐藏用户的真实Jabbere ID。名字(name)元素是房间的名字(用jabber:iq:browse浏览房间时可以看到同样的房间名)。
3. 发送当前状态给要加入的房间。XML如下:
<presence to="room@server"/>
4. 想要加入的房间提交一个type=”set”的iq包以及进入所需信息。XML如下:
<iq type="set" to="room@server">
<query xmlns="jabber:iq:conference">
<nick>mynick</nick>
<nick>mysecondnick</nick>
<secret>thesecret</secret>
</query>
</iq>
注意在用户第一个选择被接受时,用户可以提交多个昵称。如果用户没有提供昵称,服务器将指派一个昵称给用户。
5. 收到你加入的房间的通知,这个iq以下面的格式返回:
<iq type="result" from="room@server">
<query xmlns="jabber:iq:conference">
<id>room@server/uniqueidnumber</id>
<nick>mynick</nick>
</query>
</iq>
这个唯一的ID号是用户Jabber ID的一个哈希。
6.7. jabber:iq:gateway——用户地址网关
一般通过一个网关或传输器(比如AIM传输器)来实现与非Jabber网络用户的通信,每一个非Jabber网络都可能拥有唯一的用户地址,这个地址可能和Jabber IDs并不统一。用户地址网关就是解决这个问题的,它使得Jabber客户端向非Jabber网络用户发出订阅时给出正确Jabber IDs变得很容易。这些通过对用户进行提示和会话,引导用户提供创建一个正确Jabber ID所需信息来实现。下面将演示这种普通的交互:
1. 客户端向网关发出带有jabber:iq:gate名字空间查询的iq get:
<iq type="get" to="aim.jabber.org">
<query xmlns="jabber:iq:gateway"/>
</iq>
2. 服务器返回一个包含请求批准及其描述文本的iq:
<iq type="result" from="aim.jabber.org">
<query xmlns="jabber:iq:gateway">
<desc>
Please enter the AOL Screen Name of the person
you would like to contact.
</desc>
<prompt>Screen Name</prompt>
</query>
</iq>
3. 客户端向网关发送一个包含指定信息的iq set:
<iq type="set" to="aim.jabber.org">
<query xmlns="jabber:iq:gateway">
<prompt>Joe Cool</prompt>
</query>
</iq>
4. 服务器返回一个包含正确Jabber ID的iq result
<iq type="result" from="aim.jabber.org">
<query xmlns="jabber:iq:gateway">
<jid>JoeCool@aim.jabber.org</jid>
</query>
</iq>
6.8. jabber:iq:last——最后一次在线时间
最后一次在线时间名字空间提供一个标准的方法,通过这个方法可以查询一个Jabber实体一个或多个服务更新时间,或者一个客户最后一次连接(或活动)到一台服务器上的时间。每一次返回的值都是一个秒的数目。进行查询的实体可以通过下面的法则解释获取的信息:
l user@server/resource——用户最后一次活动的时间
l user@server——用户最后一次连接的时间
l server——服务器最后一次启动的时间
例子(服务器):
<iq type="get" to="jabber.org">
<query xmlns="jabber:iq:last"/>
</iq>
<iq type="result" to="stpeter@jabber.org/Gabber" from="jabber.org">
<query xmlns="jabber:iq:last" seconds="124933"/>
</iq>
例子(客户端):
<iq type="get" to="jer@jabber.org">
<query xmlns="jabber:iq:last"/>
</iq>
<iq type="result" to=stpeter@jabber.org/Gabber from="jer@jabber.org">
<query xmlns="jabber:iq:last" seconds="5024">
Disconnected
</query>
</iq>
6.9. jabber:iq:oob——绑定数据输出
绑定数据输出名字空间为客户端-客户端的文件传输提供一个标准方法,通过服务器的传输/代理的传输器实现一个特殊的名字空间:
例子:
<iq type="set" to="horatio@denmark.com" id="file_1">
<query xmlns="jabber:iq:oob">
<url>http://denmark.com/act4/letter-1.html</url>
<desc>There’s a letter for you sir.</desc>
</query>
</iq>
6.10. jabber:iq:private——私有数据存储
私有数据存储名字空间是Jabber服务器上存储私有数据的一个机制。存储的数据可以是任何合法的XML数据。在服务端存放客户端的当前状态信息是这个名字空间的典型用法。
例子1(客户端存储私有数据):
<iq type="set" id="1001">
<query xmlns="jabber:iq:private">
<winjab xmlns="winjab:prefs">
<defaultnick>Hamlet</defaultnick>
</winjab>
</query>
</iq>
例子2(客户端找回私有数据):
<iq type="get" id="1002">
<query xmlns="jabber:iq:private">
<winjab xmlns="winjab:prefs"/>
</query>
</iq>
另外,对于私有数据存储,1.4版服务器支持服务器上所有有效名字空间(以“jabber”开头的名字空间保留,为Jabber系统进行调用)的XML数据。这个数据存在向服务器端发送type=”set”的iq包的用户的花名册中。
例子1(客户端保存公有数据):
<iq type="set" id="1003">
<query xmlns="stpeter:public:favorites">
<fav_things>
<food>Thai</food>
<color>blue</color>
<composer>Bach</composer>
</fav_things>
</query>
</iq>
例子2(客户端找回公有数据):
<iq type="get" id="1004">
<query xmlns="stpeter:public:favorites">
<fav_things/>
</query>
</iq>
6.11. jabber:iq:register——注册请求
注册请求名字空间对一个或多个服务进行注册。它也被用来更新或删除一个注册。
例子:
<query xmlns="jabber:iq:register">
<instructions>
Some instructions to be displayed when the
user is filling out the form.
</instructions>
<username/>
<password/>
<email/>
<date/>
<key/>
</query>
6.12. jabber:iq:roster——联系人名单管理
联系人名单管理名字空间是客户端用来管理他们的花名册的,该花名册保存在服务器上,这样用户可以在任何地方得到它。花名册是该帐号上所有订阅信息的命令列表,包括用户昵称和联系列表。当用户从任何一个资源登陆上来,服务器将把花名册发送给用户。
花名册是一个条目的列表。每一个条目元素都有描述它的属性。每一个条目元素都包含它所属组的组元素。下面是描述<item/>元素的属性:
l “jid”是条目的Jabber ID
l “subscription”所有和本条目相关的订阅所对应的用户的当前状态。它可以是“none”(不可订阅),“to”(有一个发到该条目的订阅),“from”(从该条目发送一个订阅给我们),“both”(to、from),或者“remove”(从花名册上删除一个条目)。
l “ask”是对这个条目的一个请求的当前状态。Subscribe表示请求对该条目进行订阅,它的值就是,Unsubscribe表示取消订阅。
l “name”表示昵称
通过使用一个<iq type=”set”/>,一个Jabber客户端可以控制用户的JabberID,名称属性,群组元素,并且可以在联系人名单上创建或删除联系人。服务器根据客户端对当前状态订阅请求的响应来管理其它所有属性。
订阅请求的例子:
<iq type="set" id="uniquevalue">
<query xmlns="jabber:iq:roster">
<item jid="romeo@montague.net"
name="Romeo"
subscription="none"
ask="subscribe">
<group>friends</group>
</item>
</query>
</iq>
当一个花名册条目在服务器上改变时,服务器将把这个改变推送给一个用户。这个推送是一个普通的从服务器发送到客户端的<iq type=”set”/>包。下面是一个例子:
<iq type="set">
<query xmlns="jabber:iq:roster">
<item jid="romeo@montague.net" subscription="both"/>
</query>
</iq>
在上面的例子中,服务器推送给客户端一个花名册,表明该用户对romeo@montague.net的当前状态信息有订阅。一个花名册推送可能发生一个连接的任何时间中,该连接是另一个连接修改资源或服务器(修改订阅属性)的结果。客户端只有使用花名册推送来改变花名册的显示。但不是每次花名册推送都对用户起作用。
6.13. jabber:iq:search——用户数据库查询
任何一个代理都可以成为一个查询代理。例如,JUD查询Jabber用户,ICQ传输器查询ICQ用户。
用户发送一个进行可查询域的Get请求:
<iq
type="get"
id="1001"
to="users.jabber.org"
from="romeo@montague.net/orchard">
<query xmlns="jabber:iq:search"/>
</iq>
查询代理返回一个可查域:
<iq type="result" id="1001" from="users.jabber.org">
<query xmlns="jabber:iq:search">
<instructions>Fill in a field to search for any
matching Jabber User
</instructions>
<name/>
<first/>
<last/>
<nick/>
<email/>
<key>067941fd96a6a2752a21abcb6d737130dd51dd50</key>
</query>
</iq>
注意这些域是以提示的形式返回。为了传输的安全还包含一个密钥(下面会看到)。用户现在可以在允许的域内进行标准的查询了。用户发回一个Set请求给代理进行实际查询:
<iq
type="set"
id="1002"
to="users.jabber.org"
from="romeo@montague.net/orchard">
<query xmlns="jabber:iq:search">
<last>Capulet</last>
<key>11b830e604215c3a2a24652c69fd4efa2a7a5746</key>
</query>
</iq>
服务器根据查询返回结果:
<iq type="result" id="1002" from="users.jabber.org">
<query xmlns="jabber:iq:search">
<item jid="juliet@capulet.com">
<name>Juliet Capulet</name>
<first>Juliet</first>
<last>Capulet</last>
<nick>juliC</nick>
<email></email>
</item>
<item jid="sampson@capulet.com>
<name>Sampson Capulet</name>
<first>Sampson</first>
<last>Capulet</last>
<nick>sammy</nick>
<email></email>
</item>
</query>
</iq>
注意有两套items标记含有指定信息。这是因为通过代理发送返回有两种方法:
l 单一返回标签
l 多个“pushed”到用户的标签,类似花名册推送,如在一个时间上的一个记录。
发送的返回的样式是查询代理的一个工具。比如:
<iq type="set" from="icq.jabber.org" id="1003">
<query xmlns="jabber:iq:search">
<item jid="7090245@icq.jabber.org">
<email>juliet@capulet.com</email>
<nick>juliC</nick>
<given>Juliet</given>
<family>Capulet</family&g
Peter Saint-Andre
stpeter@jabber.org
1.4版Jabber服务协议的概述
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代替,如70902454@icq.jabber.org)。
3.1. 消息类型-“type”属性
Jabber支持几种不同的消息,这些消息通过<message/>的“type”属性来进行区分。下面就是“type”属性的有效值:
3.1.1. [default](不设置“type”属性)
表示本消息是一个普通消息。默认的情况下,客户端在没有设置属性时,将消息类型定为普通消息。
例子:
<message to="romeo@montague.net/orchard">
<body>Wherefore art though Romeo?</body>
</message>
3.1.2.type=”chat”
表示消息需要被一个接一个的显示在聊天界面上(一般是一条接一条的界面,不过实际界面可以被用户自己定义。)
例子:
<message to="romeo@montague.net/orchard" type="chat">
<body>Wherefore art though Romeo?</body>
</message>
3.1.3.type=”error”
表示消息被描述成一个错误条件。实际的错误在消息中用一个<error/>元素来描述。一个<message/>元素包括一个<body/>和一个<error/>。下面的例子将演示,当Juliet对一个不存在的用户发送一个“hi”的消息时,将收到的包体:
例子:
<message
to="juliet@capulet.com"
from="flomeo@montague.net"
type="error">
<body>hi</body>
<error code="404">Not Found</error>
</message>
3.1.4. type=”groupchat”
表示本消息需要在一个聊天室的界面中进行显示。
例子:
<message to="cauldron@conference.witches.org" 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="juliet@capulet.com/balcony">
<body>Wherefore art thou Romeo?</body>
</message>
3.2.2. “id”属性
“id”属性是作为消息的一个唯一标志。它由Jabber客户端或客户库(类似WinJab或JabberCOM),生成,客户端用它来为跟踪消息(比如将发送到一个群组聊天室的信息和从这个聊天室收到的消息相关联,或将一个消息与它可能产生的错误相关联)进行标识。“id”属性是可选的,并且在系统的别的方是不可用的。
例子:
<message to="romeo@montague.net/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="romeo@montague.net/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="juliet@capulet.com"
from="flomeo@montague.net"
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="juliet@capulet.com/balcony"
to="romeo@montague.net/orchard"
type="chat">
<thread>AAC96FEFDE226C2C04BE8F2E19A2151B</thread>
<body>Art thou not Romeo and a Montague?</body>
</message>
<message
from="romeo@montague.net/orchard"
to="juliet@capulet.com/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=’cauldron@conference.witches.org’>
<body>Thrice the brinded cat hath mew’d.</body>
<x xmlns=’jabber:x:delay’
stamp=’10541031T21:43:40’>Cached In GC History</x>
</message>
4. <presence/>元素
<presence/>元素提供关于一个Jabber实体的可用性信息。任何一个通过一个Jabber ID确认的实体可以与另一个实体进行在线状态信息的通信,这种通信大多以订阅在线状态信息的方式进行。
所有实体表现出的在线状态不是“可用”就是“不可用”。“可用”状态表示发送者可以立即收到消息。“不可用”状态表示发送者不能在当前时间收到任何数据。默认情况下,所有<presence/>元素除非包含type=”unavailable”属性外,都表示“可用”。“可用”的更多特殊形势通过<status/>和<show/>子元素进行指定。
4.1. “type”属性
<presence/>的“type”属性根据不同目的使用。除了提示其它用户本用户的可用性状态的“普通”用法外,还包括订阅、取消订阅、以及探测在线状态信息。下面是“type”属性的可用值:
4.1.1. type=”available”
如果没有包含任何“type”属性,在线状态包将被设为type=”available”,用来提供用户在线时的信息。一个type=”available”的在线状态包通常包含一个<show/>元素以详细说明Jabber实体的可用类型,以及一个<status/>元素,该元素包含人能看懂的关于该可用类型的描述。在线状态包还可以包含一个<priority/>元素,来指明该连接的Jabber ID的优先级。
例子:
<presence
from="juliet@capulet.com/balcony"
to="romeo@montague.net/orchard"/>
<show>away</show>
<status>Stay but a little, I will come again.</status>
</presence>
<show/>元素的可用值为:
l away――Jabber用户或实体在线,但不能马上联系上
l chat――Jabber用户或实体在线并有兴趣聊天
l dnd――Jabber用户或实体在线,但不想被打扰(“dnd”表示“do not disturb”)
l xa――Jabber用户或实体在线,但已经离开很长时间了(“xa”表示“extended away”)
<status/>可以包含任意特性数据,这些数据通常包含对于用户状态的描述,如,“开会中”是“away”的一个表现值,或者“忙于编码”可以是“dnd”的一个表现。
4.1.2. type=”error”
当一个在线状态包发送给一个不存在的JID时,或在发送在线状态请求时发生一个错误时,服务器都将返回一个type=”error”的在线状态包。
下面是一个例子(注意域名的类型):
<presence
type="subscribe"
to="romeo@montague.nett"/>
回复的例子:
<presence
from="romeo@montague.nett"
to="juliet@capulet.com/balcony"
type="error">
<error code=’504’>Remote server timeout. Unable to deliver
packet.</error>
</presence>
4.1.3. type=”probe”
向一个特定实体(实体不能发送在线状态消息给自己)发出在线状态信息请求。服务器而非客户端,进行一个探测请求。实际上,虽然Jabber客户端也可以发送一个探测一个指定Jabber用户是否在线的请求,但通常都是服务器端发出探测请求。注意,只有在发起请求的用户在请求所对应的用户的花名册上,并且拥有“from”或“both”订阅类型时,服务器才会发出探测请求。在下面的例子中,我们将看到我们的英雄Romeo向Juliet发出一个探测请求,Juliet所在服务器回复一个“状态报告包”(包含jabber:x:delay名字空间中指明的上次在线状态更新的时间戳)
探测请求的例子:
<presence
from="romeo@montague.net"
to="juliet@capulet.com"
type="probe"/>
回复探测请求的例子:
<presence
from="juliet@capulet.com/."
to="romeo@montague.net">
<status>Stay but a little, I will come again.</status>
<show>away</show>
<x
xmlns="jabber:x:delay"
from="juliet@capulet.com/."
stamp="15310309T23:47:15"/>
</presence>
4.1.4. type=”subscribe”
发送一个请求,这个请求是接收者在其在线状态改变时,自动发送在线状态信息给发送者。
例子:
<presence
from="romeo@montague.net"
to="juliet@capulet.com"
type="subscribe"/>
4.1.5. type=”subscribed”
发送一个消息,表明发送者接受了接受者对其再现状态订阅的请求。从现在起,当发送者的在线状态信息改变时,服务器将会把状态信息发送给接收者。
例子:
<presence
from="juliet@capulet.com"
to="romeo@montague.net"
type="subscribed"/>
4.1.6. type=”unavailable”
例子:
<presence
from="juliet@capulet.com"
to="romeo@montague.net"
type="unavailable">
<status>Disconnnected</status>
</presence>
4.1.7. type=”unsubscribe”
发送一个请求,表明接收者停止发送在线状态信息给发送者。
例子:
<presence
from="juliet@capulet.com"
to="romeo@montague.net"
type="unsubscribe"/>
4.1.8. type=”unsubscribed”
这种类型的在线状态包有两个用途:
1. 发送一个表明发送者接受接收者关于不订阅其在线状态信息的请求的通知。服务器将不再发送发送者的在线状态信息给接收者。
2. 拒绝一个订阅请求。服务器将不再发送发送者的在线状态信息给试图订阅其在线状态信息的用户。
例子:
<presence
from="romeo@montague.net"
to="juliet@capulet.com"
type="unsubscribed"/>
4.2. 其它<presence/>属性
除了设置“type”属性,还可以通过下列属性修改<presence/>元素:
4.2.1. “from”属性
标识在线状态包的发送者。一般Jabber ID再“from”属性中必须写成user@host/resource的格式。从XML的观点来说,这个属性是所有<presence/>元素所必须的,而在实际应用中,都是服务器对该属性进行添加和修改(防止一些欺骗的手段),因此客户端开发者不需要考虑它。
例子:
<presence from="juliet@capulet.com/balcony"/>
4.2.2. “id”属性
为在线状态请求包配置唯一的验证符。“id”属性由Jabber客户端或客户库(如Gabber或JabberCOM)生成,客户端用其为在线状态包的轨迹进行验证。“id”属性是可选的,并且不能用于系统其它任何地方。
例子:
<presence to="romeo@montague.net/orchard" id="JCOM_86"/>
4.2.3. “to”属性
标识在线状态包的接收者。一般Jabber ID在“to”属性中都是user@host/resource的格式,user@host的格式也是可以的,但当接收者在线时,它将转化为user@host/resource。在Jabber的一般用法中,Jabber客户端向服务器发出在线状态包,服务器将这些在线状态包发送到该用户花名册上所有的用户。当一个Jabber客户端发送的<presence/>元素中不含“to”属性时,服务器将将其转化为在线状态包发送给指定的Jabber实体。下面的例子将演示这一过程。
发送给服务器的在线状态的例子:
<presence>
<status>Stay but a little, I will come again.</status>
<show>away</show>
</presence>
服务器发给指定用户的在线状态例子:
<presence
to="romeo@montague.net/orchard"
from="juliet@capulet.com/balcony">
<status>Stay but a little, I will come again.</status>
<show>away</show>
</presence>
4.3. <presence/>的子元素
下面的元素用于<presence/>协议。
4.3.1. <priority/>
在Jabber中,根据Jabber知道的设备数或位置数,一个用户可以建立相同数量的连接。用户可以给每一个资源赋予一个数字优先级(通过对指派给该资源的Jabber客户端进行设置),这个优先级与<presence/>元素的子元素<priority/>方法进行通信。
当在线状态包发送到服务器后,服务器有能力决定哪一个连接资源需要指派一个单一的Jabber ID,该资源将收到发往该Jabber ID的消息,这是因为数字最高的资源是默认或第一资源。如果最高优先级的资源不可用,消息和其它Jabber通信将发送给次高优先级的资源(当其它资源都不可用时,一个没有从默认数到0的优先级的客户端,也可以成为第一资源)
举例来说,Julie可以通过两个资源:the balcony 和 the chamber连接她的帐号juliet@capulet.com。如果“balcony”资源的优先级被设置为“2”,而“chamber”资源的优先级被设为“1”,而且两个资源都可以连接,消息将发送到juliet@capulet.com/balcony,而不是juliet@capulet.com/chamber。
4.3.2. <show/>
可选的<show/>元素告诉Jabber客户端如何显示一个用户的在线状态。<show>标签是一个典型的<status>标签的伴随标签,<status>标签包含更多在线状态改变理由的描述信息。如果<show/>元素不在<presence/>元素中,Jabber接收客户端将指明该用户处于“普通”状态。下面是四个可选项:
标签
含义
<show>chat</show>
该客户可以马上联系上
<show>away</show>
该客户在线,但刚刚离开(如吃午饭,开会)
<show>xa</show>
该客户在线,但已经处于非活动状态很长时间了。
<show>dnd<show>
该用户处于谢绝打扰的模式
4.3.3. <status/>
<status/>元素包含更多关于用户在线状态的描述。大多数Jabber客户端都包含一些<status/>元素的默认设置;另外,它们还允许我们提供富有个性的描述如“我在吃午饭”或者“钓鱼中”。
4.3.4. <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名字空间中被更完整地描述。
5. <iq/>元素
信息/查询(IQ)在Jabber中在两个实体间构建一个根本的会话,并且允许实体间来回传送XML格式的请求和响应。信息/查询主要的用处是取得或设置公共的用户信息,比如名字,电子邮件,地址等等。但它的灵活设计使得任何种类的会话都可以发生。任何通过一个Jabber ID标识的实体都能通过一个IQ与其它实体进行会话。
5.1. “type”属性
<iq/>元素的“type”属性用于决定信息/查询是请求还是响应。下面是“type”属性的可用值:
5.1.1. type=”error”
表示查询失败。实际错误在<iq/>元素的<error/>子元素中描述。
例子:
<iq type="error" to="romeo@montague.net">
<error code="403">Forbidden</error>
</iq>
5.1.2. type=”get”
找回指派给一个查询名字空间的信息。如果没有设置属性,默认情况,这个属性包含在查询中。一个type=”get”的<iq/>元素由一个子元素构成,这个子元素通常是<query>,但也可以是<vcard/>或另一个已有的子元素。不过,指定的子元素必须左空,以便接收一个用户所需提供的信息的空间的清单。一个成功的get查询的结果type=”result”的<iq/>元素,是元素嵌套在包含了所需信息的指定子元素(如<query>或<vcard/>)。
例子:
<iq type="get">
<vCard xmlns="vcard-temp"/>
</iq>
5.1.3. type=”result”
表示<iq/>包是一个type=”get”或type=”set”的<iq/>查询的成功响应。这个成功查询的结果是一个type=”result”的<iq/>元素,该元素嵌套在一个包含所查询的信息的子元素中(如<query>、<vcard/>)。一个成功的查询或获取查询结果的返回是一个空的type=”result”的<iq/>元素。一个不成功的返回是一个type=”error”的<iq/>元素。<iq type=”result”/>通常与“id”属性的获取、设定查询有关。
例子:
<iq type="result">
<vCard version="3.0" xmlns="vcard-temp">
vCard data goes here
</vCard>
</iq>
5.1.4. type=”set”
表示<iq/>包是对设值或更改现有数据值。一个type=”set”的<iq/>元素总是包含一个指定的子元素,通常是<query>,也可以是<vcard/>或者其它可以接受的子元素。一个设置命令查询的成功返回是一个空的type=”result”的<iq/>元素。
例子:
<iq type="set">
<vCard version="3.0">
vCard data goes here
</vCard>
</iq>
5.2. 其它<iq/>属性
除了“type”属性外,IQ元素还可以通过下面的属性进行修改。
5.2.1. “from”属性
表示iq包的发送者。从XML观点来说,这个属性是所有<iq/>元素所必须的,实际应用中这个属性是服务器来增加和修改的(为防止某些欺骗),因此客户端的开发人员不需要过多关注这个属性。
例子:
<iq from="romeo@montague.net"/>
5.2.2. “id”属性
一个iq包只有唯一的标识。Jabber客户端或客户库生成“id”属性,客户端通过它来标识<iq/>包,以完成对<iq/>包的跟踪(如:一个type=”result”对应一个type=”get”或type=”set”)。“id”属性是可选的,并且不能用于系统的其它地方。
例子:
<iq type="get" from="juliet@capulet.com/balcony" id="JCOM_87"/>
<iq type="result" to="juliet@capulet.com/balcony" id="JCOM_87"/>
5.2.3 “to”属性
表示iq包的接收者。在Jabber客户端,对应“to”属性的Jabber ID的格式为user@host/resource。user@host也是可以的,如果用户在线,user@host将被置换成user@host/resource,如果用户不在线,user@host将被直接指向一个离线模块(对于类似服务器端网关这种非用户实体,情况又有所不同,因为它们不拥有资源,并且只是简单通过Jabber ID的一个“server”端口进行标识。Jud.jabber.org——Jabber用户目录就是这样一个例子)。如果<iq/>包没有<to>属性,服务器将对该包进行处理。
例子:
<iq to="juliet@capulet.com/balcony">
5.3 <iq/>的子元素
下面介绍<iq/>元素的子元素。
5.3.1. <error/>
当iq的属性类型被设置为“error”时,将用到本属性。错误代码根据一个含有错误数的“type”属性进行定义,<error/>员司包含该错误的文本描述。比如,下面就是一个坏请求:
<error code="400">Bad Request</error>
在附录中,列有错误编码及其对应的错误描述。
5.3.2. <key/>
<key/>元素为客户端-服务器之间交互提供一层安全保护。它被用户jabber:iq:register和jabber:iq:search名字空间中。
当一个客户端发起一个与服务其之间的交互时,服务器将发送一个包含一个唯一值的<key>给客户端。客户端在返回<iq type=”set”/>的消息中,包含上诉唯一值到<key/>子元素中。这样,服务器就认为该客户端时接收到原来密码的同一实体。
5.3.3. <query/>
<iq/>元素中的<query/>子元素定义所执行的查询的类型。特殊情况下,查询可以拥有一个特殊的名字空间,这个名字空间是一个通过“xmlns”属性定义的<query/>子元素。一个<iq/>元素中只能有一个<query/>子元素。
下面的例子是当我通过我的Linux机器上的Grabber客户端登陆到服务器上,将出现的XML。
<iq type="set">
<query xmlns="jabber:iq:auth">
<username>stpeter</username>
<resource>Gabber</resource>
<digest>f1e881517e9917bb815fed112d81d32b4e4b3aed</digest>
</query>
</iq>
就象你看到的那样,认证查询通过客户端认证名字空间(jabber:iq:auth)向服务器发送认证信息。一般,Jabber核心协议保留jabber:iq:*这样的名字空间。而开发者可以通过增加jabber:iq:*名字空间对Jabber核心进行扩展。这些将在下面的名字空间中进行更完整的描述。
一个空<query/>子元素可以与<iq type=”get”>元素一起发送,这样可以找回与<query/>子元素中指定的名字空间相关的一个Jabber实体的信息。比如,找回一个客户端的花名册(“联系人名单”),下面的XML可以被发送:
<iq to="juliet@capulet.com/balcony" type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
6. 名字空间
现面是Jabber中的标准名字空间:
l jabber:iq:agent——代理工具
l jabber:iq:agents——有效的代理组
l jabber:iq:auth——简单用户认证
l jabber:iq:autoupdate——版本更新申请
l jabber:iq:browse——Jabber浏览
l jabber:iq:conference——一般会议
l jabber:iq:gateway——用户地址网关
l jabber:iq:last——上次使用时间
l jabber:iq:oob——绑定数据输出
l jabber:iq:private——私有数据存储
l jabber:iq:register——注册请求
l jabber:iq:roster——花名册(联系人名单)管理
l jabber:iq:search——用户数据库查询
l jabber:iq:time——客户端时间
l jabber:iq:version——客户端版本
l jabber:x:autoupdate——版本通知申请
l jabber:x:conference——会议邀请
l jabber:x:delay——显示的对象
l jabber:x:encrypted——加密的消息
l jabber:x:envelope——消息封套
l jabber:x:event——消息事件
l jabber:x:expire——消息终止
l jabber:x:oob——绑定数据(文件传输)输出
l jabber:x:roster——内部的花名册条目
l jabber:x:signed——标记的在线状态
l vcard-temp——临时的vCard
下面将详细介绍这些名字空间的细节。
6.1. jabber:iq:agent——代理工具
代理工具名字空间包含一个代理的所有工具。jabber:iq:angents查询通常用于注册到一个指定的服务、代理、传输器。
它也可能检验一个指定代理的所有工具细节。比如,一个客户端可以决定一个开放的注册是否可以进行。
例子:
<iq id="wjAgent" type="result" from="Jabber.org">
<query xmlns="jabber:iq:agent">
<agent jid="aim.jabber.org">
<name>AIM Transport</name>
<description>This is the AIM Transport</description>
<transport>AIM/AOL ScreenName</transport>
<service>aim</service>
<register/>
</agent>
</query>
</iq>
6.2. jabber:iq:angents——可用的代理列表
可用代理列表名字空间包含一组实体,这些实体拥有一些特殊工具,并能够为另一个实体提供服务。大多数情况下,可用代理列表是用来显示一台服务器上的可用传输器列表。
注意:这个名字空间被jabber:iq:browse的支持者所反对(??)。
例子:
<iq id="wjAgents" type="result" from="jabber.org">
<query xmlns="jabber:iq:agents">
<agent jid="users.jabber.org">
<name>User Directory</name>
<description>
You may register and create a public searchable
profile, and search for other registered Jabber
users.
</description>
<service>jud</service>
<register/>
<search/>
</agent>
<agent jid="aim.jabber.org">
<name>AIM Transport</name>
<description>This is the AIM Transport</description>
<transport>AIM/AOL ScreenName</transport>
<service>aim</service>
<register/>
</agent>
</query>
</iq>
6.3. jabber:iq:auth——简单客户端认证
简单客户认证名字空间是对客户端进行认证的一个简单机制,它为客户端到服务器之间的连接创建一个资源。
认证成功返回一个type=”result”的IQ响应。不成功,就返回一个错误IQ元素。
如果没有发送名字空间或密码,如果服务器允许,服务器将创建一个匿名资源。
例子:
<iq type="set" id="JCOM_0">
<query xmlns="jabber:iq:auth">
<username>juliet</username>
<password>secret</password>
<resource>balcony</resource>
</query>
</iq>
<iq type="set" id="JCOM_0">
<query xmlns="jabber:iq:auth">
<username>juliet</username>
<digest>a5e052c48c455bf21d937ccf17225916d9486b09</digest>
<resource>balcony</resource>
</query>
</iq>
<iq type="set" id="JCOM_0">
<query xmlns="jabber:iq:auth">
<username>juliet</username>
<hash499>secret</hash499>
<resource>balcony</resource>
</query>
</iq>
6.4. jabber:iq:autoupdate——版本更新申请
版本更新申请名字空间允许客户端对所有可用软件更新进行申请请求。
例子:
<iq type="get" to="jabber.org" id="1">
<query xmlns="jabber:iq:autoupdate"/>
</iq>
6.5. jabber:iq:browse——Jabber浏览
Jabber浏览名字空间的作用是,一是为Jabber世界中已有的Jabber IDs增加结构的一个途径,一是发现为不同Jabber实体提供的服务或应用。一个Jabber浏览的基本概念就是一个jid-type(类似文件的一个模拟类型的概念)。下面是想象中的最高级别的jid-types,不过随着时间的推移,一些其它的逻辑将被增加进来:
l 应用
l 会议
l 标题
l 关键字
l 回报
l 服务
l 用户
上面每一个范畴都有一个子类列表,如用户/客户端,或用户/设备(“客户端”或“设备”只是一个“资源”的概念),会议/irc,服务/icq,标题/库存。一般的,通过使用jabber:iq:browse名字空间你将拥有一个与上述某一jid-type范畴相对应的元素,这个元素通常有一个指定子类型的“type”属性。
Jabber:iq:browse的一个用户就是代替jabber:iq:agents名字空间来列出一个服务器上所对应的代理或其它服务。下面是一个浏览服务器的例子:
Jabber客户端发送:
<iq type="get" to="jabber.org">
<query xmlns="jabber:iq:browse"/>
</iq>
Jabber服务器返回:
<iq type="result" from="jabber.org">
<service
type="jabber"
jid="jabber.org"
xmlns="jabber:iq:browse>
<service
type="jud"
jid="users.jabber.org"
name="Jabber User Directory">
<ns>jabber:iq:register</ns>
<ns>jabber:iq:search</ns>
</service>
<service
type="aim"
jid="aim.jabber.org"
name="AIM Transport">
<ns>jabber:iq:register</ns>
<ns>jabber:iq:search</ns>
</service>
<conference
type="private"
jid="conference.jabber.org"
name="Private Chatrooms">
</service>
</service>
</iq>
在会议中的一个例子:
<iq type="set" to="room@server">
<conference xmlns="jabber:iq:browse" name="Room Name">
<user jid="room@server/jidhash" name="nick1"/>
<user jid="room@server/jidhash" name="nick2"/>
</conference>
</iq>
6.6. jabber:iq:conference——一般会议
一般会议名字空间提供一个会议室的机制(如群组聊天室),并提供该会议室的入口。这个名字空间与</iq>元素配套使用来获得一个会议室的信息,包括要求加入这个会议室的请求信息,以及为这个会议室设置信息(通常是为了加入这个房间)。一个普通进入房间的请求将和下面的类似:
1. 想要加入的房间提交一个type=”get”的请求。这个XML将是下面的形式:
<iq type="get" to="room@server">
<query xmlns="jabber:iq:conference"/>
</iq>
2. 接受来自要加入的房间的type=”result”的iq响应,其中有进入房间所需要的参数。这个XML将是下面的形式:
<iq type="result" from="room@server">
<query xmlns="jabber:iq:conference">
<nick/>
<secret/>
<privacy/>
<name>Room Name</name>
</query>
</iq>
这里所有的请求元素的子元素都是可选的。昵称(nickname)元素表示进入房间需要一个昵称。密钥(secret)元素表示进入房间的用户需要提供一个密码。独处(privacy)元素表示如果用户在一个type=”set”(下面可以看到例子)的iq包中提供这样的元素,会议服务器将隐藏用户的真实Jabbere ID。名字(name)元素是房间的名字(用jabber:iq:browse浏览房间时可以看到同样的房间名)。
3. 发送当前状态给要加入的房间。XML如下:
<presence to="room@server"/>
4. 想要加入的房间提交一个type=”set”的iq包以及进入所需信息。XML如下:
<iq type="set" to="room@server">
<query xmlns="jabber:iq:conference">
<nick>mynick</nick>
<nick>mysecondnick</nick>
<secret>thesecret</secret>
</query>
</iq>
注意在用户第一个选择被接受时,用户可以提交多个昵称。如果用户没有提供昵称,服务器将指派一个昵称给用户。
5. 收到你加入的房间的通知,这个iq以下面的格式返回:
<iq type="result" from="room@server">
<query xmlns="jabber:iq:conference">
<id>room@server/uniqueidnumber</id>
<nick>mynick</nick>
</query>
</iq>
这个唯一的ID号是用户Jabber ID的一个哈希。
6.7. jabber:iq:gateway——用户地址网关
一般通过一个网关或传输器(比如AIM传输器)来实现与非Jabber网络用户的通信,每一个非Jabber网络都可能拥有唯一的用户地址,这个地址可能和Jabber IDs并不统一。用户地址网关就是解决这个问题的,它使得Jabber客户端向非Jabber网络用户发出订阅时给出正确Jabber IDs变得很容易。这些通过对用户进行提示和会话,引导用户提供创建一个正确Jabber ID所需信息来实现。下面将演示这种普通的交互:
1. 客户端向网关发出带有jabber:iq:gate名字空间查询的iq get:
<iq type="get" to="aim.jabber.org">
<query xmlns="jabber:iq:gateway"/>
</iq>
2. 服务器返回一个包含请求批准及其描述文本的iq:
<iq type="result" from="aim.jabber.org">
<query xmlns="jabber:iq:gateway">
<desc>
Please enter the AOL Screen Name of the person
you would like to contact.
</desc>
<prompt>Screen Name</prompt>
</query>
</iq>
3. 客户端向网关发送一个包含指定信息的iq set:
<iq type="set" to="aim.jabber.org">
<query xmlns="jabber:iq:gateway">
<prompt>Joe Cool</prompt>
</query>
</iq>
4. 服务器返回一个包含正确Jabber ID的iq result
<iq type="result" from="aim.jabber.org">
<query xmlns="jabber:iq:gateway">
<jid>JoeCool@aim.jabber.org</jid>
</query>
</iq>
6.8. jabber:iq:last——最后一次在线时间
最后一次在线时间名字空间提供一个标准的方法,通过这个方法可以查询一个Jabber实体一个或多个服务更新时间,或者一个客户最后一次连接(或活动)到一台服务器上的时间。每一次返回的值都是一个秒的数目。进行查询的实体可以通过下面的法则解释获取的信息:
l user@server/resource——用户最后一次活动的时间
l user@server——用户最后一次连接的时间
l server——服务器最后一次启动的时间
例子(服务器):
<iq type="get" to="jabber.org">
<query xmlns="jabber:iq:last"/>
</iq>
<iq type="result" to="stpeter@jabber.org/Gabber" from="jabber.org">
<query xmlns="jabber:iq:last" seconds="124933"/>
</iq>
例子(客户端):
<iq type="get" to="jer@jabber.org">
<query xmlns="jabber:iq:last"/>
</iq>
<iq type="result" to=stpeter@jabber.org/Gabber from="jer@jabber.org">
<query xmlns="jabber:iq:last" seconds="5024">
Disconnected
</query>
</iq>
6.9. jabber:iq:oob——绑定数据输出
绑定数据输出名字空间为客户端-客户端的文件传输提供一个标准方法,通过服务器的传输/代理的传输器实现一个特殊的名字空间:
例子:
<iq type="set" to="horatio@denmark.com" id="file_1">
<query xmlns="jabber:iq:oob">
<url>http://denmark.com/act4/letter-1.html</url>
<desc>There’s a letter for you sir.</desc>
</query>
</iq>
6.10. jabber:iq:private——私有数据存储
私有数据存储名字空间是Jabber服务器上存储私有数据的一个机制。存储的数据可以是任何合法的XML数据。在服务端存放客户端的当前状态信息是这个名字空间的典型用法。
例子1(客户端存储私有数据):
<iq type="set" id="1001">
<query xmlns="jabber:iq:private">
<winjab xmlns="winjab:prefs">
<defaultnick>Hamlet</defaultnick>
</winjab>
</query>
</iq>
例子2(客户端找回私有数据):
<iq type="get" id="1002">
<query xmlns="jabber:iq:private">
<winjab xmlns="winjab:prefs"/>
</query>
</iq>
另外,对于私有数据存储,1.4版服务器支持服务器上所有有效名字空间(以“jabber”开头的名字空间保留,为Jabber系统进行调用)的XML数据。这个数据存在向服务器端发送type=”set”的iq包的用户的花名册中。
例子1(客户端保存公有数据):
<iq type="set" id="1003">
<query xmlns="stpeter:public:favorites">
<fav_things>
<food>Thai</food>
<color>blue</color>
<composer>Bach</composer>
</fav_things>
</query>
</iq>
例子2(客户端找回公有数据):
<iq type="get" id="1004">
<query xmlns="stpeter:public:favorites">
<fav_things/>
</query>
</iq>
6.11. jabber:iq:register——注册请求
注册请求名字空间对一个或多个服务进行注册。它也被用来更新或删除一个注册。
例子:
<query xmlns="jabber:iq:register">
<instructions>
Some instructions to be displayed when the
user is filling out the form.
</instructions>
<username/>
<password/>
<email/>
<date/>
<key/>
</query>
6.12. jabber:iq:roster——联系人名单管理
联系人名单管理名字空间是客户端用来管理他们的花名册的,该花名册保存在服务器上,这样用户可以在任何地方得到它。花名册是该帐号上所有订阅信息的命令列表,包括用户昵称和联系列表。当用户从任何一个资源登陆上来,服务器将把花名册发送给用户。
花名册是一个条目的列表。每一个条目元素都有描述它的属性。每一个条目元素都包含它所属组的组元素。下面是描述<item/>元素的属性:
l “jid”是条目的Jabber ID
l “subscription”所有和本条目相关的订阅所对应的用户的当前状态。它可以是“none”(不可订阅),“to”(有一个发到该条目的订阅),“from”(从该条目发送一个订阅给我们),“both”(to、from),或者“remove”(从花名册上删除一个条目)。
l “ask”是对这个条目的一个请求的当前状态。Subscribe表示请求对该条目进行订阅,它的值就是,Unsubscribe表示取消订阅。
l “name”表示昵称
通过使用一个<iq type=”set”/>,一个Jabber客户端可以控制用户的JabberID,名称属性,群组元素,并且可以在联系人名单上创建或删除联系人。服务器根据客户端对当前状态订阅请求的响应来管理其它所有属性。
订阅请求的例子:
<iq type="set" id="uniquevalue">
<query xmlns="jabber:iq:roster">
<item jid="romeo@montague.net"
name="Romeo"
subscription="none"
ask="subscribe">
<group>friends</group>
</item>
</query>
</iq>
当一个花名册条目在服务器上改变时,服务器将把这个改变推送给一个用户。这个推送是一个普通的从服务器发送到客户端的<iq type=”set”/>包。下面是一个例子:
<iq type="set">
<query xmlns="jabber:iq:roster">
<item jid="romeo@montague.net" subscription="both"/>
</query>
</iq>
在上面的例子中,服务器推送给客户端一个花名册,表明该用户对romeo@montague.net的当前状态信息有订阅。一个花名册推送可能发生一个连接的任何时间中,该连接是另一个连接修改资源或服务器(修改订阅属性)的结果。客户端只有使用花名册推送来改变花名册的显示。但不是每次花名册推送都对用户起作用。
6.13. jabber:iq:search——用户数据库查询
任何一个代理都可以成为一个查询代理。例如,JUD查询Jabber用户,ICQ传输器查询ICQ用户。
用户发送一个进行可查询域的Get请求:
<iq
type="get"
id="1001"
to="users.jabber.org"
from="romeo@montague.net/orchard">
<query xmlns="jabber:iq:search"/>
</iq>
查询代理返回一个可查域:
<iq type="result" id="1001" from="users.jabber.org">
<query xmlns="jabber:iq:search">
<instructions>Fill in a field to search for any
matching Jabber User
</instructions>
<name/>
<first/>
<last/>
<nick/>
<email/>
<key>067941fd96a6a2752a21abcb6d737130dd51dd50</key>
</query>
</iq>
注意这些域是以提示的形式返回。为了传输的安全还包含一个密钥(下面会看到)。用户现在可以在允许的域内进行标准的查询了。用户发回一个Set请求给代理进行实际查询:
<iq
type="set"
id="1002"
to="users.jabber.org"
from="romeo@montague.net/orchard">
<query xmlns="jabber:iq:search">
<last>Capulet</last>
<key>11b830e604215c3a2a24652c69fd4efa2a7a5746</key>
</query>
</iq>
服务器根据查询返回结果:
<iq type="result" id="1002" from="users.jabber.org">
<query xmlns="jabber:iq:search">
<item jid="juliet@capulet.com">
<name>Juliet Capulet</name>
<first>Juliet</first>
<last>Capulet</last>
<nick>juliC</nick>
<email></email>
</item>
<item jid="sampson@capulet.com>
<name>Sampson Capulet</name>
<first>Sampson</first>
<last>Capulet</last>
<nick>sammy</nick>
<email></email>
</item>
</query>
</iq>
注意有两套items标记含有指定信息。这是因为通过代理发送返回有两种方法:
l 单一返回标签
l 多个“pushed”到用户的标签,类似花名册推送,如在一个时间上的一个记录。
发送的返回的样式是查询代理的一个工具。比如:
<iq type="set" from="icq.jabber.org" id="1003">
<query xmlns="jabber:iq:search">
<item jid="7090245@icq.jabber.org">
<email>juliet@capulet.com</email>
<nick>juliC</nick>
<given>Juliet</given>
<family>Capulet</family&g
发表评论
-
Struts2与ajax的组合
2007-07-04 17:32 8920Struts2与ajax ... -
WebWork 2.2在Apache+Resin上发布的一点注意事项
2007-06-25 10:39 1163webwork 2.2的服务方式改成了Filter方式,也随之 ... -
页面连续刷新js控制
2007-04-18 11:09 1326<script> function but ... -
JavaScript中的私有成员
2007-04-18 09:37 877Douglas Crockford www.crockford ... -
面向对象的 Javascript
2007-04-16 18:09 1063阅读前:Pro Javascript Tech ... -
javascript小技巧
2007-04-12 16:53 1185事件源对象 event.srcElement.tagName ... -
The Holy Grail of Sync
2007-04-10 08:58 1105The Holy Grail of Sync http:/ ...
相关推荐
**Jabber协议概述** Jabber协议,全称为Extensible Messaging and Presence Protocol(XMPP),是一种基于XML的即时通信协议。它最初由Jabber开源社区开发,并在2002年被互联网工程任务组(IETF)采纳为RFC 3920和...
**二、Jabber协议的三大基石:XML元素** Jabber协议的构建基于三个关键的XML元素: 1. **** —— 用于承载两个Jabber用户间或两个JabberID之间的消息内容,无论是文本、图片还是其他媒体,都可通过此元素进行传输...
Jabber(XMPP)服务协议的概述中文版
##### 2.2 Jabber协议概述 Jabber协议是一种开放式的即时消息协议,支持多种消息格式和扩展特性。它采用XML作为消息传递的标准格式,并利用XMPP(Extensible Messaging and Presence Protocol)作为核心协议栈,...
Jabber协议主要由三个顶级XML元素构成:、和(info/query),每个元素都承载了大量的数据并通过特定的属性和命名空间来描述信息的具体内容。这些元素是Jabber协议的基础,也是实现即时通讯的关键所在。 ##### 2.1 ...
1. **Jabber协议概述** Jabber协议是一种开放的XML协议,它与传统的即时通讯系统不同,因为它允许第三方开发者创建扩展以满足特定需求。协议包括三个顶级XML元素:`<message/>`, `<presence/>`, 和 `<iq/>`(info/...
### Jabber/XMPP技术概述 Jabber/XMPP(eXtensible Messaging and Presence Protocol)是一种基于XML的即时消息传递和在线状态服务协议。它最初由Jabber开发,后被IETF采纳为正式标准。该协议的核心优势在于其开放...
Cisco Jabber SIP URI呼叫概述 文档介绍的是Cisco Jabber客户端通过移动远程访问(Mobile Remote Access, MRA)实现与不同组织的用户进行SIP URI呼叫的配置过程。该过程涉及到Cisco统一通信管理器(Cisco Unified ...
二、XMPP协议概述 XMPP是一种基于XML的开放标准协议,用于即时消息传递和在线状态管理。它以分散式架构设计,具有良好的可扩展性和安全性,被广泛应用于企业级通讯系统和各种IM应用中。JABBER是XMPP的一个早期实现,...
4. **开放标准**:Jabber是基于开放标准XMPP(Extensible Messaging and Presence Protocol)开发的,这意味着任何人都可以自由地开发客户端和服务端软件来支持Jabber协议。 5. **跨平台兼容性**:由于其开放标准和...
**JabberClient 开源项目概述** JabberClient 是一个基于 .NET Compact Framework 的开源项目,使用 C# 语言编写。它旨在为 Windows PC 和 Windows Mobile PDA 平台提供一个功能丰富的 Jabber 即时通讯客户端。...
通过使用Jabber协议,系统能够实现实时消息传输、好友列表管理、状态更新等功能。此外,为了确保系统的可维护性和可扩展性,采用了软件工程的开发模式,并利用统一建模语言(UML)进行了详细的系统建模。 #### 三、...
1. **概述**:RFC3920详细介绍了可扩展消息和出席信息协议(XMPP)的核心功能,该协议通过XML流实现在任意两个网络终端之间进行接近实时的结构化信息交换。XMPP提供了通用的、可扩展的框架,主要用于即时消息和出席...
**Jabber.py 开源项目概述** `Jabber.py` 是一个专为 Python2 设计的开源库,用于构建和扩展即时通讯(Instant Messaging,IM)应用,特别是在 Jabber 协议上运行的服务。Jabber 是一种基于 XML 的开放即时通讯协议...
Pandion是一款专为用户提供简单、直观的即时通讯体验的软件,它基于开放标准的XMPP(Extensible Messaging and Presence Protocol)和Jabber协议。Pandion不仅提供基本的聊天功能,还支持群组聊天、文件传输等多样化...
文档首先介绍了XMPP的概述,指出它起源于Jabber开源社区,后经IETF的XMPP工作组进一步发展,定义了XMPP 1.0的核心功能。XMPP协议的关键字遵循RFC 2119中的规定,如"MUST"、"SHOULD"等,具有明确的规范意义。 在通用...
该协议最初由Jabber开源社区在1999年开发,后被IETF(Internet Engineering Task Force)采纳并进一步发展。XMPP的核心功能定义在RFC3920中,主要面向即时消息和出席信息应用,并遵循RFC2779的需求。 #### 二、通用...
Jabber 是最早实现 XMPP 协议的即时通讯系统之一,而 XMPP 实际上是 Jabber 协议的一个标准化版本。两者之间的关系可以这样理解:XMPP 是一种开放标准,而 Jabber 是该标准的一种具体实现。通过使用 XMPP 协议,...