1. 介绍
Jabber是一个由开源社区发起并领导开发的即时消息和在线状态的系统。Jabber系统和其它即时消息(IM)服务的一个功能上的差别在于Jabber拥有开放的XML协议。在保持Jabber1.0版本有关消息核心以及在线状态的协议的基础上,增加了一些必要的扩展。本文档将对Jabber服务器1.4版的Jabber协议进行介绍。
在XML上下文的数据流中,Jabber开放的XML协议包括三个顶级XML元素:
l <message/>
l <presence/>
l <iq/>(info/query)
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>标
分享到:
相关推荐
**Jabber协议概述** Jabber协议,全称为Extensible Messaging and Presence Protocol(XMPP),是一种基于XML的即时通信协议。它最初由Jabber开源社区开发,并在2002年被互联网工程任务组(IETF)采纳为RFC 3920和...
### Jabber 协议概述 #### 1. 引言 Jabber 是一款由开源社区发起并主导的即时消息和在线状态系统。与传统的即时通讯(IM)服务不同,Jabber 的一大特色在于其采用了一种开放的 XML 协议。在 Jabber 1.0 版本的基础上...
①英文文档,详细分析jabber协议。This book is dedicated to the Jabber community: innovation, insight and fun. Who could ask for anything more? ②英文文档。This code-rich reference includes many ...
**二、Jabber协议的三大基石:XML元素** Jabber协议的构建基于三个关键的XML元素: 1. **** —— 用于承载两个Jabber用户间或两个JabberID之间的消息内容,无论是文本、图片还是其他媒体,都可通过此元素进行传输...
Jabber协议是一种基于XML的即时通讯协议,由开源社区主导开发,主要用于实现即时消息和在线状态的交换。它的核心优势在于其开放性,允许开发者根据需求进行扩展和定制。Jabber协议主要包括三个顶级XML元素:`...
Jabber(XMPP)服务协议的概述中文版
Jabber协议的核心特点在于其开放性,允许开发者创建自定义的扩展以满足特定的应用场景。 在Jabber协议中,存在三个主要的XML元素,它们构成了协议的基础框架: 1. `<message/>`元素:这是用于两个Jabber用户之间...
Jabber协议主要由三个顶级XML元素构成:、和(info/query),每个元素都承载了大量的数据并通过特定的属性和命名空间来描述信息的具体内容。这些元素是Jabber协议的基础,也是实现即时通讯的关键所在。 ##### 2.1 ...
标题中的“基于jabber协议的linq聊天群发工具源代码”揭示了这个项目的核心内容。Jabber协议,也称为XMPP(Extensible Messaging and Presence Protocol),是一种开放的即时通讯协议,它允许用户进行实时通信,包括...
该模型不仅适用于基于Jabber协议的系统与其他应用系统的连接,而且扩展了Jabber协议系统的功能,有效地解决了其他应用系统以Web Services方式与Jabber系统的通信问题。 #### 关键词 - 通信 - 协议 - Simple Object...
Jabber协议,也被称为XMPP(Extensible Messaging and Presence Protocol),是一种基于XML的开放标准,用于即时通讯和在线状态管理。它最初由Jabber开源社区开发,并被Internet工程任务组(IETF)标准化。XMPP的...
基于Jabber协议的手机即时通讯系统的研究与实现.nh
Java中的Jabber协议是一个基于XML的即时通讯(IM)协议,它允许用户进行实时通信,包括文本消息、文件传输、语音和视频通话等。这个协议是开放源代码且标准化的,由XMPP(可扩展消息处理现场协议)基金会维护。在...
**Jabber协议** Jabber 协议基于 Extensible Messaging and Presence Protocol (XMPP),是一个用于即时通讯的开放标准。XMPP 使用 XML 数据格式进行数据交换,这让它能够处理复杂的消息结构和扩展性,比如支持多用户...
《即时消息传递在Java中的应用——Jabber协议》是一本深入探讨如何使用Java实现即时通讯的专著。这本书主要围绕Jabber协议展开,这是一个开放标准,用于构建实时通信系统,尤其是即时消息(IM)服务。Jabber协议基于...
##### 2.2 Jabber协议概述 Jabber协议是一种开放式的即时消息协议,支持多种消息格式和扩展特性。它采用XML作为消息传递的标准格式,并利用XMPP(Extensible Messaging and Presence Protocol)作为核心协议栈,...
### Jabber/XMPP技术概述 Jabber/XMPP(eXtensible Messaging and Presence Protocol)是一种基于XML的即时消息传递和在线状态服务协议。它最初由Jabber开发,后被IETF采纳为正式标准。该协议的核心优势在于其开放...
本系统主要研究Jabber相关协议的即时通信系统,对Jabber相关协议以及Jabber框架进行了...在此基础上,利用Jabber的体系架构,通过Jabber协议,在Linux系统中开发出一个能够兼容网络上多数采用标准Jabber协议的客户端。
通过使用Jabber协议,JeCat-Jabber实现了与标准XMPP服务器的互操作性,这意味着用户可以与其他使用相同协议的用户进行交流,无论他们使用的是哪个IM应用。 在提供的压缩包文件中,我们可以找到以下三个文件: 1. *...