青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

君子性非異也,善假于物也。

如有恒,何須三更起,半夜眠;最怕莫,三天打魚兩天曬網(wǎng),竹籃打水一場空!
posts - 31, comments - 23, trackbacks - 0, articles - 30
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

[轉(zhuǎn)]Jabber 協(xié)議

Posted on 2007-01-25 14:17 neter 閱讀(371) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)與通信
Jabber 協(xié)議 概述
Peter Saint-Andre

stpeter@jabber.org

1.4版Jabber服務(wù)協(xié)議的概述

1. 介紹
? Jabber是一個(gè)由開源社區(qū)發(fā)起并領(lǐng)導(dǎo)開發(fā)的即時(shí)消息和在線狀態(tài)的系統(tǒng)。Jabber系統(tǒng)和其它即時(shí)消息(IM)服務(wù)的一個(gè)功能上的差別在于Jabber擁有開放的XML協(xié)議。在保持Jabber1.0版本有關(guān)消息核心以及在線狀態(tài)的協(xié)議的基礎(chǔ)上,增加了一些必要的擴(kuò)展。本文檔將對Jabber服務(wù)器1.4版的Jabber協(xié)議進(jìn)行介紹。

? 在XML上下文的數(shù)據(jù)流中,Jabber開放的XML協(xié)議包括三個(gè)頂級XML元素:

l ? ? ? <message/>

l ? ? ? <presence/>

l ? ? ? <iq/>(info/query)

每一個(gè)元素通過屬性和名字空間包含大量的數(shù)據(jù),這些屬性和名字空間都是Jabber的組成部分(但不包括為特殊應(yīng)用的名字空間應(yīng)用)。下面將描述整個(gè)Jabber協(xié)議。如果您想獲得關(guān)于Jabber系統(tǒng)結(jié)構(gòu)的信息,請查看名為Jabber技術(shù)概述的文檔(http://docs.jabber.org/general/html/overview.html)。

2. XML流
? 一個(gè)Jabber會話由兩個(gè)平行的XML流組成,一個(gè)從客戶端到服務(wù)器端,另一個(gè)從服務(wù)端到客戶端。當(dāng)一個(gè)Jabber客戶端連接上一個(gè)Jabber服務(wù)器時(shí),這個(gè)客戶端將發(fā)起一個(gè)客戶端-服務(wù)器的XML流,同時(shí)作為響應(yīng),服務(wù)器也將發(fā)起一個(gè)服務(wù)器-客戶端的XML流。所有<message/>,<presence/>,以及<iq/>元素都被放在這些XML流的上下文中。下面就有一個(gè)例子:



? 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>



*注意:必須等到當(dāng)一個(gè)<iq/>元素(特別指一個(gè)’jabber:iq:auth’名字空間下的<query/>元素)發(fā)送了認(rèn)證信息后,服務(wù)器才會同意用戶會話進(jìn)行工作。

3. <message/>元素
? <message/>元素是Jabber開放XML協(xié)議三個(gè)頂級元素中的一個(gè)。它被用來包含兩個(gè)Jabber用戶間互相發(fā)送消息內(nèi)容,或者兩個(gè)Jabber IDs之間更一般的消息(因?yàn)?,通過神奇的傳輸器,另一個(gè)IM系統(tǒng)可以用Jabber ID代替,如70902454@icq.jabber.org)。

3.1. 消息類型-“type”屬性
? Jabber支持幾種不同的消息,這些消息通過<message/>的“type”屬性來進(jìn)行區(qū)分。下面就是“type”屬性的有效值:

3.1.1. [default](不設(shè)置“type”屬性)
? 表示本消息是一個(gè)普通消息。默認(rèn)的情況下,客戶端在沒有設(shè)置屬性時(shí),將消息類型定為普通消息。

? 例子:



<message to="romeo@montague.net/orchard">

<body>Wherefore art though Romeo?</body>

</message>

3.1.2.type=”chat”
? 表示消息需要被一個(gè)接一個(gè)的顯示在聊天界面上(一般是一條接一條的界面,不過實(shí)際界面可以被用戶自己定義。)

? 例子:



? <message to="romeo@montague.net/orchard" type="chat">

<body>Wherefore art though Romeo?</body>

</message>

3.1.3.type=”error”
? 表示消息被描述成一個(gè)錯(cuò)誤條件。實(shí)際的錯(cuò)誤在消息中用一個(gè)<error/>元素來描述。一個(gè)<message/>元素包括一個(gè)<body/>和一個(gè)<error/>。下面的例子將演示,當(dāng)Juliet對一個(gè)不存在的用戶發(fā)送一個(gè)“hi”的消息時(shí),將收到的包體:

? 例子:



<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”
? 表示本消息需要在一個(gè)聊天室的界面中進(jìn)行顯示。

? 例子:



? <message to="cauldron@conference.witches.org" type="groupchat">

<body>Double, double toil and trouble</body>

</message>

3.2. <message/>其它屬性
? 除了設(shè)置“type”屬性,還可以通過下面的屬性修改<message/>元素:

3.2.1. “from”屬性
? 消息發(fā)送者的標(biāo)志??偟脕碚f,Jabber ID的”from”必須是user@host/resource的格式。從XML的觀點(diǎn)來說,這個(gè)屬性必須包含于所有的<message/>元素中,為了對付一些欺騙,實(shí)際應(yīng)用中服務(wù)器添加或置換這個(gè)屬性。因此,它并不是客戶端開發(fā)者需要關(guān)心的問題。

? 例子:



? <message from="juliet@capulet.com/balcony">

<body>Wherefore art thou Romeo?</body>

</message>

3.2.2. “id”屬性
? “id”屬性是作為消息的一個(gè)唯一標(biāo)志。它由Jabber客戶端或客戶庫(類似WinJab或JabberCOM),生成,客戶端用它來為跟蹤消息(比如將發(fā)送到一個(gè)群組聊天室的信息和從這個(gè)聊天室收到的消息相關(guān)聯(lián),或?qū)⒁粋€(gè)消息與它可能產(chǎn)生的錯(cuò)誤相關(guān)聯(lián))進(jìn)行標(biāo)識?!癷d”屬性是可選的,并且在系統(tǒng)的別的方是不可用的。

? 例子:



? <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方式解決,如果用戶不在線,直接發(fā)送離線存儲器。這個(gè)屬性是所有<message/>元素必須的。

? 例子:



<message to="romeo@montague.net/orchard">

<body>Wherefore art thou Romeo?</body>

</message>

3.3. <message/>中的子元素
? 下面的子元素是用來定義一個(gè)Jabber消息的上下文或數(shù)據(jù)元。

3.3.1. <body/>
? 這個(gè)元素包含消息的主要文本。<body/>元素只存在于一個(gè)<message/>元素中,并且只能包含明文。不過,它可以由其它子元素構(gòu)成(如<error/>、<x/>)。

3.3.2. <error/>
? 當(dāng)消息類型屬性被置為“error”時(shí),這個(gè)元素將被使用。錯(cuò)誤代碼被一個(gè)”type”屬性定義,這個(gè)”type”屬性包含代碼數(shù),通過<error/>元素來包含一個(gè)這個(gè)錯(cuò)誤的文本描述。<error/>元素必須包含在原始消息的<body/>中。下面的例子將演示,當(dāng)Juliet向一個(gè)不存在的用戶發(fā)送“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/>元素結(jié)合XHTML名字空間(http://www.w3.org/1999/xhtml),為一個(gè)消息提供一個(gè)交替的名字空間,就像在email世界中規(guī)定同時(shí)發(fā)送普通文本與HTML版本的郵件消息一樣。這個(gè)功能使用的是W3C開發(fā)的基本XHTML格式(http://www.w3.org/TR/xhtml-basic/),關(guān)于Jabber在消息中的XHTML執(zhí)行細(xì)節(jié),請看Jabber消息的暫定格式規(guī)范(http://docs.jabber.org/draft-proto/html/xhtml.html)。所有XHTML的根元素都必須是<html xmlns=”http://www.w3.org/1999/xhmtl”></html>。這個(gè)根元素中,支持任何一個(gè)基本XHTML格式中定義的元素,但不是每一個(gè)元素可以通過即時(shí)消息的上下文來進(jìn)行理解。

3.3.4. <subject/>
? 這是一個(gè)可選元素,包含消息的標(biāo)題。

3.3.5. <thread/>
? 當(dāng)一個(gè)Jabber客戶端發(fā)送一個(gè)”chat”類型的消息,將生成唯一的線程ID(通常是由發(fā)送者的Jabber ID和當(dāng)前時(shí)間生成的一個(gè)hash)。消息發(fā)送者和接收者在聊天中后續(xù)的消息都包含一個(gè)<thread/>子元素,這個(gè)子元素包含原始線程ID。這使得消息發(fā)送者和接收者對回復(fù)進(jìn)行認(rèn)證并創(chuàng)建一個(gè)對話線程。下面的是例子:

<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/>元素作為一個(gè)擴(kuò)展機(jī)制來使用,或發(fā)送從服務(wù)器發(fā)送命令給客戶端,或從一個(gè)客戶端發(fā)送命令到另一個(gè)客戶端。每次用到這個(gè)元素時(shí),必須指明相關(guān)的XML名字空間。單一消息可以包含多個(gè)<x/>子元素實(shí)例。下列已定義的名字空間可以被<x/>子元素使用:

l ? ? ? jabber:x:autoupdate

l ? ? ? jabber:x:delay

l ? ? ? jabber:x:encrypted

l ? ? ? jabber:x:oob

l ? ? ? jabber:x:roster

這些名字空間在下面的Jabber名字空間中被更完整地描述。

下面是一個(gè)使用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/>元素提供關(guān)于一個(gè)Jabber實(shí)體的可用性信息。任何一個(gè)通過一個(gè)Jabber ID確認(rèn)的實(shí)體可以與另一個(gè)實(shí)體進(jìn)行在線狀態(tài)信息的通信,這種通信大多以訂閱在線狀態(tài)信息的方式進(jìn)行。

? 所有實(shí)體表現(xiàn)出的在線狀態(tài)不是“可用”就是“不可用”。“可用”狀態(tài)表示發(fā)送者可以立即收到消息?!安豢捎谩睜顟B(tài)表示發(fā)送者不能在當(dāng)前時(shí)間收到任何數(shù)據(jù)。默認(rèn)情況下,所有<presence/>元素除非包含type=”unavailable”屬性外,都表示“可用”。“可用”的更多特殊形勢通過<status/>和<show/>子元素進(jìn)行指定。

4.1. “type”屬性
? <presence/>的“type”屬性根據(jù)不同目的使用。除了提示其它用戶本用戶的可用性狀態(tài)的“普通”用法外,還包括訂閱、取消訂閱、以及探測在線狀態(tài)信息。下面是“type”屬性的可用值:

4.1.1. type=”available”
? 如果沒有包含任何“type”屬性,在線狀態(tài)包將被設(shè)為type=”available”,用來提供用戶在線時(shí)的信息。一個(gè)type=”available”的在線狀態(tài)包通常包含一個(gè)<show/>元素以詳細(xì)說明Jabber實(shí)體的可用類型,以及一個(gè)<status/>元素,該元素包含人能看懂的關(guān)于該可用類型的描述。在線狀態(tài)包還可以包含一個(gè)<priority/>元素,來指明該連接的Jabber ID的優(yōu)先級。

? 例子:



? <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用戶或?qū)嶓w在線,但不能馬上聯(lián)系上

l ? ? ? chat――Jabber用戶或?qū)嶓w在線并有興趣聊天

l ? ? ? dnd――Jabber用戶或?qū)嶓w在線,但不想被打擾(“dnd”表示“do not disturb”)

l ? ? ? xa――Jabber用戶或?qū)嶓w在線,但已經(jīng)離開很長時(shí)間了(“xa”表示“extended away”)

<status/>可以包含任意特性數(shù)據(jù),這些數(shù)據(jù)通常包含對于用戶狀態(tài)的描述,如,“開會中”是“away”的一個(gè)表現(xiàn)值,或者“忙于編碼”可以是“dnd”的一個(gè)表現(xiàn)。

4.1.2. type=”error”
? 當(dāng)一個(gè)在線狀態(tài)包發(fā)送給一個(gè)不存在的JID時(shí),或在發(fā)送在線狀態(tài)請求時(shí)發(fā)生一個(gè)錯(cuò)誤時(shí),服務(wù)器都將返回一個(gè)type=”error”的在線狀態(tài)包。

? 下面是一個(gè)例子(注意域名的類型):



<presence

? ? type="subscribe"

to="romeo@montague.nett"/>



? 回復(fù)的例子:



? <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”
? 向一個(gè)特定實(shí)體(實(shí)體不能發(fā)送在線狀態(tài)消息給自己)發(fā)出在線狀態(tài)信息請求。服務(wù)器而非客戶端,進(jìn)行一個(gè)探測請求。實(shí)際上,雖然Jabber客戶端也可以發(fā)送一個(gè)探測一個(gè)指定Jabber用戶是否在線的請求,但通常都是服務(wù)器端發(fā)出探測請求。注意,只有在發(fā)起請求的用戶在請求所對應(yīng)的用戶的花名冊上,并且擁有“from”或“both”訂閱類型時(shí),服務(wù)器才會發(fā)出探測請求。在下面的例子中,我們將看到我們的英雄Romeo向Juliet發(fā)出一個(gè)探測請求,Juliet所在服務(wù)器回復(fù)一個(gè)“狀態(tài)報(bào)告包”(包含jabber:x:delay名字空間中指明的上次在線狀態(tài)更新的時(shí)間戳)

? 探測請求的例子:

?

? <presence

from="romeo@montague.net"

to="juliet@capulet.com"

type="probe"/>



? 回復(fù)探測請求的例子:



? <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”
? 發(fā)送一個(gè)請求,這個(gè)請求是接收者在其在線狀態(tài)改變時(shí),自動發(fā)送在線狀態(tài)信息給發(fā)送者。

? 例子:



? <presence

from="romeo@montague.net"

to="juliet@capulet.com"

type="subscribe"/>



4.1.5. type=”subscribed”
? 發(fā)送一個(gè)消息,表明發(fā)送者接受了接受者對其再現(xiàn)狀態(tài)訂閱的請求。從現(xiàn)在起,當(dāng)發(fā)送者的在線狀態(tài)信息改變時(shí),服務(wù)器將會把狀態(tài)信息發(fā)送給接收者。

? 例子:



? <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”
? 發(fā)送一個(gè)請求,表明接收者停止發(fā)送在線狀態(tài)信息給發(fā)送者。

? 例子:

?

<presence

from="juliet@capulet.com"

to="romeo@montague.net"

type="unsubscribe"/>

4.1.8. type=”unsubscribed”
? 這種類型的在線狀態(tài)包有兩個(gè)用途:

1. ? 發(fā)送一個(gè)表明發(fā)送者接受接收者關(guān)于不訂閱其在線狀態(tài)信息的請求的通知。服務(wù)器將不再發(fā)送發(fā)送者的在線狀態(tài)信息給接收者。

2. ? 拒絕一個(gè)訂閱請求。服務(wù)器將不再發(fā)送發(fā)送者的在線狀態(tài)信息給試圖訂閱其在線狀態(tài)信息的用戶。

例子:



<presence

from="romeo@montague.net"

to="juliet@capulet.com"

type="unsubscribed"/>

4.2. 其它<presence/>屬性
? 除了設(shè)置“type”屬性,還可以通過下列屬性修改<presence/>元素:

4.2.1. “from”屬性
標(biāo)識在線狀態(tài)包的發(fā)送者。一般Jabber ID再“from”屬性中必須寫成user@host/resource的格式。從XML的觀點(diǎn)來說,這個(gè)屬性是所有<presence/>元素所必須的,而在實(shí)際應(yīng)用中,都是服務(wù)器對該屬性進(jìn)行添加和修改(防止一些欺騙的手段),因此客戶端開發(fā)者不需要考慮它。

例子:



<presence from="juliet@capulet.com/balcony"/>

4.2.2. “id”屬性
? 為在線狀態(tài)請求包配置唯一的驗(yàn)證符?!癷d”屬性由Jabber客戶端或客戶庫(如Gabber或JabberCOM)生成,客戶端用其為在線狀態(tài)包的軌跡進(jìn)行驗(yàn)證?!癷d”屬性是可選的,并且不能用于系統(tǒng)其它任何地方。

? 例子:



? <presence to="romeo@montague.net/orchard" id="JCOM_86"/>

4.2.3. “to”屬性
? 標(biāo)識在線狀態(tài)包的接收者。一般Jabber ID在“to”屬性中都是user@host/resource的格式,user@host的格式也是可以的,但當(dāng)接收者在線時(shí),它將轉(zhuǎn)化為user@host/resource。在Jabber的一般用法中,Jabber客戶端向服務(wù)器發(fā)出在線狀態(tài)包,服務(wù)器將這些在線狀態(tài)包發(fā)送到該用戶花名冊上所有的用戶。當(dāng)一個(gè)Jabber客戶端發(fā)送的<presence/>元素中不含“to”屬性時(shí),服務(wù)器將將其轉(zhuǎn)化為在線狀態(tài)包發(fā)送給指定的Jabber實(shí)體。下面的例子將演示這一過程。

? 發(fā)送給服務(wù)器的在線狀態(tài)的例子:



? <presence>

<status>Stay but a little, I will come again.</status>

<show>away</show>

</presence>



服務(wù)器發(fā)給指定用戶的在線狀態(tài)例子:



<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/>協(xié)議。

4.3.1. <priority/>
? 在Jabber中,根據(jù)Jabber知道的設(shè)備數(shù)或位置數(shù),一個(gè)用戶可以建立相同數(shù)量的連接。用戶可以給每一個(gè)資源賦予一個(gè)數(shù)字優(yōu)先級(通過對指派給該資源的Jabber客戶端進(jìn)行設(shè)置),這個(gè)優(yōu)先級與<presence/>元素的子元素<priority/>方法進(jìn)行通信。

? 當(dāng)在線狀態(tài)包發(fā)送到服務(wù)器后,服務(wù)器有能力決定哪一個(gè)連接資源需要指派一個(gè)單一的Jabber ID,該資源將收到發(fā)往該Jabber ID的消息,這是因?yàn)閿?shù)字最高的資源是默認(rèn)或第一資源。如果最高優(yōu)先級的資源不可用,消息和其它Jabber通信將發(fā)送給次高優(yōu)先級的資源(當(dāng)其它資源都不可用時(shí),一個(gè)沒有從默認(rèn)數(shù)到0的優(yōu)先級的客戶端,也可以成為第一資源)

? 舉例來說,Julie可以通過兩個(gè)資源:the balcony 和 the chamber連接她的帳號juliet@capulet.com。如果“balcony”資源的優(yōu)先級被設(shè)置為“2”,而“chamber”資源的優(yōu)先級被設(shè)為“1”,而且兩個(gè)資源都可以連接,消息將發(fā)送到juliet@capulet.com/balcony,而不是juliet@capulet.com/chamber。

4.3.2. <show/>
? 可選的<show/>元素告訴Jabber客戶端如何顯示一個(gè)用戶的在線狀態(tài)。<show>標(biāo)簽是一個(gè)典型的<status>標(biāo)簽的伴隨標(biāo)簽,<status>標(biāo)簽包含更多在線狀態(tài)改變理由的描述信息。如果<show/>元素不在<presence/>元素中,Jabber接收客戶端將指明該用戶處于“普通”狀態(tài)。下面是四個(gè)可選項(xiàng):

標(biāo)簽
含義

<show>chat</show>
該客戶可以馬上聯(lián)系上

<show>away</show>
該客戶在線,但剛剛離開(如吃午飯,開會)

<show>xa</show>
該客戶在線,但已經(jīng)處于非活動狀態(tài)很長時(shí)間了。

<show>dnd<show>
該用戶處于謝絕打擾的模式


4.3.3. <status/>
? <status/>元素包含更多關(guān)于用戶在線狀態(tài)的描述。大多數(shù)Jabber客戶端都包含一些<status/>元素的默認(rèn)設(shè)置;另外,它們還允許我們提供富有個(gè)性的描述如“我在吃午飯”或者“釣魚中”。

4.3.4. <x/>
<x/>元素作為一個(gè)擴(kuò)展機(jī)制來使用,或發(fā)送從服務(wù)器發(fā)送命令給客戶端,或從一個(gè)客戶端發(fā)送命令到另一個(gè)客戶端。每次用到這個(gè)元素時(shí),必須指明相關(guān)的XML名字空間。單一消息可以包含多個(gè)<x/>子元素實(shí)例。下列已定義的名字空間可以被<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中在兩個(gè)實(shí)體間構(gòu)建一個(gè)根本的會話,并且允許實(shí)體間來回傳送XML格式的請求和響應(yīng)。信息/查詢主要的用處是取得或設(shè)置公共的用戶信息,比如名字,電子郵件,地址等等。但它的靈活設(shè)計(jì)使得任何種類的會話都可以發(fā)生。任何通過一個(gè)Jabber ID標(biāo)識的實(shí)體都能通過一個(gè)IQ與其它實(shí)體進(jìn)行會話。

5.1. “type”屬性
? <iq/>元素的“type”屬性用于決定信息/查詢是請求還是響應(yīng)。下面是“type”屬性的可用值:

5.1.1. type=”error”
? 表示查詢失敗。實(shí)際錯(cuò)誤在<iq/>元素的<error/>子元素中描述。

? 例子:

?

? <iq type="error" to="romeo@montague.net">

<error code="403">Forbidden</error>

</iq>

5.1.2. type=”get”
? 找回指派給一個(gè)查詢名字空間的信息。如果沒有設(shè)置屬性,默認(rèn)情況,這個(gè)屬性包含在查詢中。一個(gè)type=”get”的<iq/>元素由一個(gè)子元素構(gòu)成,這個(gè)子元素通常是<query>,但也可以是<vcard/>或另一個(gè)已有的子元素。不過,指定的子元素必須左空,以便接收一個(gè)用戶所需提供的信息的空間的清單。一個(gè)成功的get查詢的結(jié)果type=”result”的<iq/>元素,是元素嵌套在包含了所需信息的指定子元素(如<query>或<vcard/>)。

? 例子:

? <iq type="get">

<vCard xmlns="vcard-temp"/>

? </iq>

5.1.3. type=”result”
? 表示<iq/>包是一個(gè)type=”get”或type=”set”的<iq/>查詢的成功響應(yīng)。這個(gè)成功查詢的結(jié)果是一個(gè)type=”result”的<iq/>元素,該元素嵌套在一個(gè)包含所查詢的信息的子元素中(如<query>、<vcard/>)。一個(gè)成功的查詢或獲取查詢結(jié)果的返回是一個(gè)空的type=”result”的<iq/>元素。一個(gè)不成功的返回是一個(gè)type=”error”的<iq/>元素。<iq type=”result”/>通常與“id”屬性的獲取、設(shè)定查詢有關(guān)。

例子:

? <iq type="result">

<vCard version="3.0" xmlns="vcard-temp">

vCard data goes here

</vCard>

</iq>

5.1.4. type=”set”
? 表示<iq/>包是對設(shè)值或更改現(xiàn)有數(shù)據(jù)值。一個(gè)type=”set”的<iq/>元素總是包含一個(gè)指定的子元素,通常是<query>,也可以是<vcard/>或者其它可以接受的子元素。一個(gè)設(shè)置命令查詢的成功返回是一個(gè)空的type=”result”的<iq/>元素。

? 例子:



? <iq type="set">

<vCard version="3.0">

vCard data goes here

</vCard>

</iq>

5.2. 其它<iq/>屬性
? 除了“type”屬性外,IQ元素還可以通過下面的屬性進(jìn)行修改。

5.2.1. “from”屬性
? 表示iq包的發(fā)送者。從XML觀點(diǎn)來說,這個(gè)屬性是所有<iq/>元素所必須的,實(shí)際應(yīng)用中這個(gè)屬性是服務(wù)器來增加和修改的(為防止某些欺騙),因此客戶端的開發(fā)人員不需要過多關(guān)注這個(gè)屬性。

? 例子:

?

? <iq from="romeo@montague.net"/>

5.2.2. “id”屬性
? 一個(gè)iq包只有唯一的標(biāo)識。Jabber客戶端或客戶庫生成“id”屬性,客戶端通過它來標(biāo)識<iq/>包,以完成對<iq/>包的跟蹤(如:一個(gè)type=”result”對應(yīng)一個(gè)type=”get”或type=”set”)?!癷d”屬性是可選的,并且不能用于系統(tǒng)的其它地方。

? 例子:

? <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客戶端,對應(yīng)“to”屬性的Jabber ID的格式為user@host/resource。user@host也是可以的,如果用戶在線,user@host將被置換成user@host/resource,如果用戶不在線,user@host將被直接指向一個(gè)離線模塊(對于類似服務(wù)器端網(wǎng)關(guān)這種非用戶實(shí)體,情況又有所不同,因?yàn)樗鼈儾粨碛匈Y源,并且只是簡單通過Jabber ID的一個(gè)“server”端口進(jìn)行標(biāo)識。Jud.jabber.org——Jabber用戶目錄就是這樣一個(gè)例子)。如果<iq/>包沒有<to>屬性,服務(wù)器將對該包進(jìn)行處理。

? 例子:

? <iq to="juliet@capulet.com/balcony">

5.3 <iq/>的子元素
? 下面介紹<iq/>元素的子元素。

5.3.1. <error/>
? 當(dāng)iq的屬性類型被設(shè)置為“error”時(shí),將用到本屬性。錯(cuò)誤代碼根據(jù)一個(gè)含有錯(cuò)誤數(shù)的“type”屬性進(jìn)行定義,<error/>員司包含該錯(cuò)誤的文本描述。比如,下面就是一個(gè)壞請求:

?

? <error code="400">Bad Request</error>

?

? 在附錄中,列有錯(cuò)誤編碼及其對應(yīng)的錯(cuò)誤描述。

5.3.2. <key/>
? <key/>元素為客戶端-服務(wù)器之間交互提供一層安全保護(hù)。它被用戶jabber:iq:register和jabber:iq:search名字空間中。

? 當(dāng)一個(gè)客戶端發(fā)起一個(gè)與服務(wù)其之間的交互時(shí),服務(wù)器將發(fā)送一個(gè)包含一個(gè)唯一值的<key>給客戶端??蛻舳嗽诜祷?lt;iq type=”set”/>的消息中,包含上訴唯一值到<key/>子元素中。這樣,服務(wù)器就認(rèn)為該客戶端時(shí)接收到原來密碼的同一實(shí)體。

5.3.3. <query/>
? <iq/>元素中的<query/>子元素定義所執(zhí)行的查詢的類型。特殊情況下,查詢可以擁有一個(gè)特殊的名字空間,這個(gè)名字空間是一個(gè)通過“xmlns”屬性定義的<query/>子元素。一個(gè)<iq/>元素中只能有一個(gè)<query/>子元素。

? 下面的例子是當(dāng)我通過我的Linux機(jī)器上的Grabber客戶端登陸到服務(wù)器上,將出現(xiàn)的XML。



<iq type="set">

<query xmlns="jabber:iq:auth">

<username>stpeter</username>

<resource>Gabber</resource>

<digest>f1e881517e9917bb815fed112d81d32b4e4b3aed</digest>

</query>

</iq>



就象你看到的那樣,認(rèn)證查詢通過客戶端認(rèn)證名字空間(jabber:iq:auth)向服務(wù)器發(fā)送認(rèn)證信息。一般,Jabber核心協(xié)議保留jabber:iq:*這樣的名字空間。而開發(fā)者可以通過增加jabber:iq:*名字空間對Jabber核心進(jìn)行擴(kuò)展。這些將在下面的名字空間中進(jìn)行更完整的描述。

一個(gè)空<query/>子元素可以與<iq type=”get”>元素一起發(fā)送,這樣可以找回與<query/>子元素中指定的名字空間相關(guān)的一個(gè)Jabber實(shí)體的信息。比如,找回一個(gè)客戶端的花名冊(“聯(lián)系人名單”),下面的XML可以被發(fā)送:

<iq to="juliet@capulet.com/balcony" type="get">

<query xmlns="jabber:iq:roster"/>

</iq>

6. 名字空間
? 現(xiàn)面是Jabber中的標(biāo)準(zhǔn)名字空間:

l ? ? ? jabber:iq:agent——代理工具

l ? ? ? jabber:iq:agents——有效的代理組

l ? ? ? jabber:iq:auth——簡單用戶認(rèn)證

l ? ? ? jabber:iq:autoupdate——版本更新申請

l ? ? ? jabber:iq:browse——Jabber瀏覽

l ? ? ? jabber:iq:conference——一般會議

l ? ? ? jabber:iq:gateway——用戶地址網(wǎng)關(guān)

l ? ? ? jabber:iq:last——上次使用時(shí)間

l ? ? ? jabber:iq:oob——綁定數(shù)據(jù)輸出

l ? ? ? jabber:iq:private——私有數(shù)據(jù)存儲

l ? ? ? jabber:iq:register——注冊請求

l ? ? ? jabber:iq:roster——花名冊(聯(lián)系人名單)管理

l ? ? ? jabber:iq:search——用戶數(shù)據(jù)庫查詢

l ? ? ? jabber:iq:time——客戶端時(shí)間

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——綁定數(shù)據(jù)(文件傳輸)輸出

l ? ? ? jabber:x:roster——內(nèi)部的花名冊條目

l ? ? ? jabber:x:signed——標(biāo)記的在線狀態(tài)

l ? ? ? vcard-temp——臨時(shí)的vCard

下面將詳細(xì)介紹這些名字空間的細(xì)節(jié)。

6.1. jabber:iq:agent——代理工具
? 代理工具名字空間包含一個(gè)代理的所有工具。jabber:iq:angents查詢通常用于注冊到一個(gè)指定的服務(wù)、代理、傳輸器。

? 它也可能檢驗(yàn)一個(gè)指定代理的所有工具細(xì)節(jié)。比如,一個(gè)客戶端可以決定一個(gè)開放的注冊是否可以進(jìn)行。

? 例子:

? <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——可用的代理列表
? 可用代理列表名字空間包含一組實(shí)體,這些實(shí)體擁有一些特殊工具,并能夠?yàn)榱硪粋€(gè)實(shí)體提供服務(wù)。大多數(shù)情況下,可用代理列表是用來顯示一臺服務(wù)器上的可用傳輸器列表。

? 注意:這個(gè)名字空間被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——簡單客戶端認(rèn)證
簡單客戶認(rèn)證名字空間是對客戶端進(jìn)行認(rèn)證的一個(gè)簡單機(jī)制,它為客戶端到服務(wù)器之間的連接創(chuàng)建一個(gè)資源。

認(rèn)證成功返回一個(gè)type=”result”的IQ響應(yīng)。不成功,就返回一個(gè)錯(cuò)誤IQ元素。

如果沒有發(fā)送名字空間或密碼,如果服務(wù)器允許,服務(wù)器將創(chuàng)建一個(gè)匿名資源。

例子:



<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——版本更新申請
? 版本更新申請名字空間允許客戶端對所有可用軟件更新進(jìn)行申請請求。

? 例子:

<iq type="get" to="jabber.org" id="1">

<query xmlns="jabber:iq:autoupdate"/>

</iq>

6.5. jabber:iq:browse——Jabber瀏覽
? Jabber瀏覽名字空間的作用是,一是為Jabber世界中已有的Jabber IDs增加結(jié)構(gòu)的一個(gè)途徑,一是發(fā)現(xiàn)為不同Jabber實(shí)體提供的服務(wù)或應(yīng)用。一個(gè)Jabber瀏覽的基本概念就是一個(gè)jid-type(類似文件的一個(gè)模擬類型的概念)。下面是想象中的最高級別的jid-types,不過隨著時(shí)間的推移,一些其它的邏輯將被增加進(jìn)來:

l ? ? ? 應(yīng)用

l ? ? ? 會議

l ? ? ? 標(biāo)題

l ? ? ? 關(guān)鍵字

l ? ? ? 回報(bào)

l ? ? ? 服務(wù)

l ? ? ? 用戶

上面每一個(gè)范疇都有一個(gè)子類列表,如用戶/客戶端,或用戶/設(shè)備(“客戶端”或“設(shè)備”只是一個(gè)“資源”的概念),會議/irc,服務(wù)/icq,標(biāo)題/庫存。一般的,通過使用jabber:iq:browse名字空間你將擁有一個(gè)與上述某一jid-type范疇相對應(yīng)的元素,這個(gè)元素通常有一個(gè)指定子類型的“type”屬性。

Jabber:iq:browse的一個(gè)用戶就是代替jabber:iq:agents名字空間來列出一個(gè)服務(wù)器上所對應(yīng)的代理或其它服務(wù)。下面是一個(gè)瀏覽服務(wù)器的例子:

Jabber客戶端發(fā)送:



<iq type="get" to="jabber.org">

<query xmlns="jabber:iq:browse"/>

</iq>



Jabber服務(wù)器返回:



<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>



在會議中的一個(gè)例子:



<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——一般會議
? 一般會議名字空間提供一個(gè)會議室的機(jī)制(如群組聊天室),并提供該會議室的入口。這個(gè)名字空間與</iq>元素配套使用來獲得一個(gè)會議室的信息,包括要求加入這個(gè)會議室的請求信息,以及為這個(gè)會議室設(shè)置信息(通常是為了加入這個(gè)房間)。一個(gè)普通進(jìn)入房間的請求將和下面的類似:

1. ? 想要加入的房間提交一個(gè)type=”get”的請求。這個(gè)XML將是下面的形式:



<iq type="get" to="room@server">

<query xmlns="jabber:iq:conference"/>

</iq>



2. ? 接受來自要加入的房間的type=”result”的iq響應(yīng),其中有進(jìn)入房間所需要的參數(shù)。這個(gè)XML將是下面的形式:



<iq type="result" from="room@server">

<query xmlns="jabber:iq:conference">

<nick/>

<secret/>

<privacy/>

<name>Room Name</name>

</query>

</iq>



這里所有的請求元素的子元素都是可選的。昵稱(nickname)元素表示進(jìn)入房間需要一個(gè)昵稱。密鑰(secret)元素表示進(jìn)入房間的用戶需要提供一個(gè)密碼。獨(dú)處(privacy)元素表示如果用戶在一個(gè)type=”set”(下面可以看到例子)的iq包中提供這樣的元素,會議服務(wù)器將隱藏用戶的真實(shí)Jabbere ID。名字(name)元素是房間的名字(用jabber:iq:browse瀏覽房間時(shí)可以看到同樣的房間名)。

3. ? 發(fā)送當(dāng)前狀態(tài)給要加入的房間。XML如下:



<presence to="room@server"/>



4. ? 想要加入的房間提交一個(gè)type=”set”的iq包以及進(jìn)入所需信息。XML如下:



<iq type="set" to="room@server">

<query xmlns="jabber:iq:conference">

<nick>mynick</nick>

<nick>mysecondnick</nick>

<secret>thesecret</secret>

</query>

</iq>



注意在用戶第一個(gè)選擇被接受時(shí),用戶可以提交多個(gè)昵稱。如果用戶沒有提供昵稱,服務(wù)器將指派一個(gè)昵稱給用戶。

5. ? 收到你加入的房間的通知,這個(gè)iq以下面的格式返回:



<iq type="result" from="room@server">

<query xmlns="jabber:iq:conference">

<id>room@server/uniqueidnumber</id>

<nick>mynick</nick>

</query>

</iq>



這個(gè)唯一的ID號是用戶Jabber ID的一個(gè)哈希。

6.7. jabber:iq:gateway——用戶地址網(wǎng)關(guān)
? 一般通過一個(gè)網(wǎng)關(guān)或傳輸器(比如AIM傳輸器)來實(shí)現(xiàn)與非Jabber網(wǎng)絡(luò)用戶的通信,每一個(gè)非Jabber網(wǎng)絡(luò)都可能擁有唯一的用戶地址,這個(gè)地址可能和Jabber IDs并不統(tǒng)一。用戶地址網(wǎng)關(guān)就是解決這個(gè)問題的,它使得Jabber客戶端向非Jabber網(wǎng)絡(luò)用戶發(fā)出訂閱時(shí)給出正確Jabber IDs變得很容易。這些通過對用戶進(jìn)行提示和會話,引導(dǎo)用戶提供創(chuàng)建一個(gè)正確Jabber ID所需信息來實(shí)現(xiàn)。下面將演示這種普通的交互:

1. ? 客戶端向網(wǎng)關(guān)發(fā)出帶有jabber:iq:gate名字空間查詢的iq get:



<iq type="get" to="aim.jabber.org">

<query xmlns="jabber:iq:gateway"/>

</iq>



2. ? 服務(wù)器返回一個(gè)包含請求批準(zhǔn)及其描述文本的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. ? 客戶端向網(wǎng)關(guān)發(fā)送一個(gè)包含指定信息的iq set:



<iq type="set" to="aim.jabber.org">

<query xmlns="jabber:iq:gateway">

<prompt>Joe Cool</prompt>

</query>

</iq>



4. ? 服務(wù)器返回一個(gè)包含正確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——最后一次在線時(shí)間
最后一次在線時(shí)間名字空間提供一個(gè)標(biāo)準(zhǔn)的方法,通過這個(gè)方法可以查詢一個(gè)Jabber實(shí)體一個(gè)或多個(gè)服務(wù)更新時(shí)間,或者一個(gè)客戶最后一次連接(或活動)到一臺服務(wù)器上的時(shí)間。每一次返回的值都是一個(gè)秒的數(shù)目。進(jìn)行查詢的實(shí)體可以通過下面的法則解釋獲取的信息:

l ? ? ? user@server/resource——用戶最后一次活動的時(shí)間

l ? ? ? user@server——用戶最后一次連接的時(shí)間

l ? ? ? server——服務(wù)器最后一次啟動的時(shí)間

例子(服務(wù)器):



<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——綁定數(shù)據(jù)輸出
? 綁定數(shù)據(jù)輸出名字空間為客戶端-客戶端的文件傳輸提供一個(gè)標(biāo)準(zhǔn)方法,通過服務(wù)器的傳輸/代理的傳輸器實(shí)現(xiàn)一個(gè)特殊的名字空間:

例子:



<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——私有數(shù)據(jù)存儲
? 私有數(shù)據(jù)存儲名字空間是Jabber服務(wù)器上存儲私有數(shù)據(jù)的一個(gè)機(jī)制。存儲的數(shù)據(jù)可以是任何合法的XML數(shù)據(jù)。在服務(wù)端存放客戶端的當(dāng)前狀態(tài)信息是這個(gè)名字空間的典型用法。

? 例子1(客戶端存儲私有數(shù)據(jù)):



<iq type="set" id="1001">

<query xmlns="jabber:iq:private">

<winjab xmlns="winjab:prefs">

<defaultnick>Hamlet</defaultnick>

</winjab>

</query>

</iq>



例子2(客戶端找回私有數(shù)據(jù)):



<iq type="get" id="1002">

<query xmlns="jabber:iq:private">

<winjab xmlns="winjab:prefs"/>

</query>

</iq>



另外,對于私有數(shù)據(jù)存儲,1.4版服務(wù)器支持服務(wù)器上所有有效名字空間(以“jabber”開頭的名字空間保留,為Jabber系統(tǒng)進(jìn)行調(diào)用)的XML數(shù)據(jù)。這個(gè)數(shù)據(jù)存在向服務(wù)器端發(fā)送type=”set”的iq包的用戶的花名冊中。

例子1(客戶端保存公有數(shù)據(jù)):



<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(客戶端找回公有數(shù)據(jù)):



<iq type="get" id="1004">

<query xmlns="stpeter:public:favorites">

<fav_things/>

</query>

</iq>

6.11. jabber:iq:register——注冊請求
注冊請求名字空間對一個(gè)或多個(gè)服務(wù)進(jìn)行注冊。它也被用來更新或刪除一個(gè)注冊。

例子:

<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——聯(lián)系人名單管理
聯(lián)系人名單管理名字空間是客戶端用來管理他們的花名冊的,該花名冊保存在服務(wù)器上,這樣用戶可以在任何地方得到它?;麅允窃搸ぬ柹纤杏嗛喰畔⒌拿盍斜恚ㄓ脩絷欠Q和聯(lián)系列表。當(dāng)用戶從任何一個(gè)資源登陸上來,服務(wù)器將把花名冊發(fā)送給用戶。

花名冊是一個(gè)條目的列表。每一個(gè)條目元素都有描述它的屬性。每一個(gè)條目元素都包含它所屬組的組元素。下面是描述<item/>元素的屬性:

l ? ? ? “jid”是條目的Jabber ID

l ? ? ? “subscription”所有和本條目相關(guān)的訂閱所對應(yīng)的用戶的當(dāng)前狀態(tài)。它可以是“none”(不可訂閱),“to”(有一個(gè)發(fā)到該條目的訂閱),“from”(從該條目發(fā)送一個(gè)訂閱給我們),“both”(to、from),或者“remove”(從花名冊上刪除一個(gè)條目)。

l ? ? ? “ask”是對這個(gè)條目的一個(gè)請求的當(dāng)前狀態(tài)。Subscribe表示請求對該條目進(jìn)行訂閱,它的值就是,Unsubscribe表示取消訂閱。

l ? ? ? “name”表示昵稱

通過使用一個(gè)<iq type=”set”/>,一個(gè)Jabber客戶端可以控制用戶的JabberID,名稱屬性,群組元素,并且可以在聯(lián)系人名單上創(chuàng)建或刪除聯(lián)系人。服務(wù)器根據(jù)客戶端對當(dāng)前狀態(tài)訂閱請求的響應(yīng)來管理其它所有屬性。

訂閱請求的例子:



<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>



當(dāng)一個(gè)花名冊條目在服務(wù)器上改變時(shí),服務(wù)器將把這個(gè)改變推送給一個(gè)用戶。這個(gè)推送是一個(gè)普通的從服務(wù)器發(fā)送到客戶端的<iq type=”set”/>包。下面是一個(gè)例子:



<iq type="set">

<query xmlns="jabber:iq:roster">

<item jid="romeo@montague.net" subscription="both"/>

</query>

</iq>



? 在上面的例子中,服務(wù)器推送給客戶端一個(gè)花名冊,表明該用戶對romeo@montague.net的當(dāng)前狀態(tài)信息有訂閱。一個(gè)花名冊推送可能發(fā)生一個(gè)連接的任何時(shí)間中,該連接是另一個(gè)連接修改資源或服務(wù)器(修改訂閱屬性)的結(jié)果??蛻舳酥挥惺褂没麅酝扑蛠砀淖兓麅缘娘@示。但不是每次花名冊推送都對用戶起作用。

6.13. jabber:iq:search——用戶數(shù)據(jù)庫查詢
? 任何一個(gè)代理都可以成為一個(gè)查詢代理。例如,JUD查詢Jabber用戶,ICQ傳輸器查詢ICQ用戶。

? 用戶發(fā)送一個(gè)進(jìn)行可查詢域的Get請求:



<iq

type="get"

id="1001"

to="users.jabber.org"

from="romeo@montague.net/orchard">

<query xmlns="jabber:iq:search"/>

</iq>



? 查詢代理返回一個(gè)可查域:

<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>



? 注意這些域是以提示的形式返回。為了傳輸?shù)陌踩€包含一個(gè)密鑰(下面會看到)。用戶現(xiàn)在可以在允許的域內(nèi)進(jìn)行標(biāo)準(zhǔn)的查詢了。用戶發(fā)回一個(gè)Set請求給代理進(jìn)行實(shí)際查詢:

? <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>



? 服務(wù)器根據(jù)查詢返回結(jié)果:



<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標(biāo)記含有指定信息。這是因?yàn)橥ㄟ^代理發(fā)送返回有兩種方法:

l ? ? ? 單一返回標(biāo)簽

l ? ? ? 多個(gè)“pushed”到用戶的標(biāo)簽,類似花名冊推送,如在一個(gè)時(shí)間上的一個(gè)記錄。

發(fā)送的返回的樣式是查詢代理的一個(gè)工具。比如:



<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>

</item>

</query>

</iq>



多個(gè)查詢結(jié)果通過服務(wù)器進(jìn)行推送。當(dāng)所有數(shù)據(jù)發(fā)送完畢,服務(wù)器將發(fā)送下面的返回結(jié)果:



<iq type="result" from="icq.jabber.org" id="1003">

<query xmlns="jabber:iq:search"/>

</iq>



客戶端接收到多個(gè)“sets”,每一個(gè)都被記錄,最后收到一個(gè)表示“數(shù)據(jù)結(jié)尾”的“返回”。在每一個(gè)<item>標(biāo)簽中,JID屬性都被強(qiáng)制帶上。

例子:



<iq

type="get"

id="1001"

to="users.jabber.org"

from="juliet@capulet.com">

<query xmlns="jabber:iq:search"/>

</iq>

6.14. jabber:iq:time——客戶端時(shí)間
? 客戶端時(shí)間名字空間是客戶端改變當(dāng)前時(shí)間的一個(gè)標(biāo)準(zhǔn)方法。

? 例子:



<iq type="result" from="stpeter@jabber.org">

<query xmlns="jabber:iq:time">

<utc>20010214T18:55:06</utc>

<display>2/15/00 4:55:06 PM</display>

</query>

</iq>

6.15. jabber:iq:version——客戶端版本
? 客戶端版本名字空間是得到另一個(gè)用戶的客戶端的版本信息的一個(gè)標(biāo)準(zhǔn)方法。

? 例子:



<iq type="result" from="stpeter@jabber.org/Gabber">

<query xmlns="jabber:iq:version">

<name>Gabber</name>

<version>0.8.1 (Powered by: jabberoo 1.0.0</version>

<os>Linux 2.2.16-22 i686</os>

</query>

</iq>

6.16. jabber:x:autoupdate——應(yīng)用程序版本通知
? 版本更改申請名字空間使服務(wù)器可以在一個(gè)應(yīng)用的新版本可用時(shí)通知客戶端。

? 例子:

?

<message from="winjab.sourceforge.net">

<x xmlns="jabber:x:autoupdate">A new version of WinJab

is available, see http://winjab.sourceforge.net/

</x>

</message>

6.17. jabber:x:conference——會議邀請
? 會議邀請名字空間使用戶可以邀請其它Jabber用戶到指定會議室。相關(guān)聯(lián)信息——該會議室的Jabber ID,內(nèi)嵌在一個(gè)消息的<x/>元素中。

? 例子:



<message to="romeo@montague.net" from="juliet@capulet.com">

<body>Wherefore art thou Romeo?</body>

<x xmlns="jabber:x:conference" jid="balcony@conference.capulet.com/>

</message>

6.18. jabber:x:delay——標(biāo)記對象延時(shí)
? 標(biāo)記對象延時(shí)名字空間是消息和當(dāng)前狀態(tài)信息的時(shí)間戳信息,其中,當(dāng)一個(gè)Jabber實(shí)體不在線時(shí),當(dāng)前狀態(tài)信息可以保存并在稍后發(fā)送。當(dāng)實(shí)體上線時(shí),包含的信息標(biāo)記對象延時(shí)名字空間使Jabber客戶端顯示出該包體最早產(chǎn)生的時(shí)間,而不是它發(fā)送給Jabber實(shí)體的時(shí)間。

? 例子:



<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>



6.19. jabber:x:encrypted——加密消息
? 加密消息名字空間用來支持使用公共密鑰(一般通過客戶端使用PGP或GPG,服務(wù)端用同樣的名字空間進(jìn)行加密來實(shí)現(xiàn))加密的消息交互。一個(gè)相關(guān)的名字空間,jabber:x:signed,用來進(jìn)行當(dāng)前狀態(tài)信息的加密。

? 例子:



<message from=’juliet@capulet.com/balcony’ to=’romeo@montague.net/orchard’>

<body>This Message is Encrypted</body>

<x xmlns=’jabber:x:encrypted’>

hQEOA7ucqu53AhlPEAP/ZbU6oPnRAbIcUxMK1XRVnkgZ/Agtq1tcTQuEZxbpZLl4

C/4psQGLgBU5h5Y3/khxtJTPXKn1izyc+DRZ8hqn2p4mwC8ioKTBJ6P6dfEpQEyt

a4bimM5fqdeh4gRkMhwThRSJxBCJBVVWFEViu+0KlHHB5AeeL4qwRGb2dhGjIgQD

/R9x0D0qtgBGwf/TVnRGZYRX7epxCNuNDEYKZSs4LEoTPL8CVsAWOzS2QgS0GBqt

tFDKId6XaNu36dB2D8VHdxQnI8RtHo9pfTYDaXWB3dMGTt896iEO/sTuucYObf3s

K5Kygg0uWpBpvQPj8Y041FhnUBz8DRGCnuFLQxCI6ch4ybauXfOKNOGDQwmsnJZm

6OaeVFUwdsedI3c6VdQtodnWVutckR5BOjnn0VqnhrVTu7cp6VXrrRK4g9atPEe6

C4R/MilBjzIJBcET0jhWuAyiBo3gN/6IqYRZNSXL9ZqGPJwNTlYim1EHN3qBqiUw

zUMamEoRzcusn80Z7kylve5ujIeSD/pVwoawHHvLp92kO2hd0yGD0UrWSfKU1o6y

EY8yhZ5P1v02pIKigAUI2c6LTDxt/KhSxQ==

=fijN

</x>

</message>

6.20. jabber:x:envelope——消息信封
? 消息信封名字空間是表明消息有更多的尋址方式,如聯(lián)合email進(jìn)行的尋址。下面是一些所支持的名字空間:

l ? ? ? to

l ? ? ? cc

l ? ? ? replyto

l ? ? ? from

l ? ? ? forwardedby

上述每一個(gè)元素都帶有一個(gè)”jid”屬性來標(biāo)識Jabber實(shí)體是發(fā)送、中轉(zhuǎn)、還是收到消息。

例子:



<message from=’juliet@capulet.com/tomb’ to=’romeo@montague.net/tomb’>

<body>And there I am. Where is my Romeo?</body>

<x xmlns=’jabber:x:envelope’>

<to jid=’romeo@heaven.org>Romeo</to>

<forwardedby jid=’root@heaven.org>God</forwardedby>

</x>

</message>

6.21. jabber:x:event——消息事件
? 消息時(shí)間名字空間是標(biāo)識一條消息的狀態(tài)的一個(gè)機(jī)制?,F(xiàn)在,事件與一條消息如下般相關(guān)聯(lián):

l ? ? ? <composing/>——個(gè)用戶正在對消息進(jìn)行回復(fù)

l ? ? ? <delivered/>——發(fā)送給指定接收者的消息

l ? ? ? <displayed/>——顯示給指定接收者的消息

l ? ? ? <offline/>——為離線進(jìn)行存儲的消息

對于客戶端來說,這些消息事件的支持是可選的,而且,只有在另一用戶在聊天中發(fā)出請求,這些消息事件才會被發(fā)送。不同的Jabber客戶端將對當(dāng)前狀態(tài)消息事件進(jìn)行不同的顯示。

對消息通知的請求的例子:



<message

from="juliet@capulet.com/balcony"

to="romeo@montague.net/orchard"

id="1001">

<body>By whose direction found’st thou out this place?</body>

<x xmlns="jabber:x:event">

<composing/>

</x>

</message>



發(fā)送消息通知的例子:



<message from="romeo@montague.net/orchard" to="juliet@capulet.com/balcony">

<body>By whose direction found’st thou out this place?</body>

<x xmlns="jabber:x:event">

<composing/>

<id>1001<id/>

</x>

</message>



? 可以同時(shí)請求多個(gè)消息事件。

6.22. jabber:x:expire——消息到期
? 消息到期名字空間是說明一條消息擁有一個(gè)有限的存活事件的一個(gè)簡單擴(kuò)展。如果消息被離線存儲,而到了到期時(shí)間,服務(wù)器將不再發(fā)送該消息。如果一條消息為預(yù)覽就進(jìn)行發(fā)送,Jabber客戶端可以選擇不顯示該消息?!皊econdes”屬性定義消息發(fā)送的事件。

? 例子:



<message from="sailor@denmark.com" to="horatio@denmark.com">

<body>There’s a letter for you sir</body>

<x xmlns="jabber:x:expire" seconds="3600"/>

</message>



6.23. jabber:x:oob——綁定數(shù)據(jù)輸出
? 綁定數(shù)據(jù)輸出名字空間使用戶可以通過交換一個(gè)標(biāo)準(zhǔn)的URL來實(shí)現(xiàn)文件傳輸?shù)哪侩?。使用jabber:x:oob的URLs交換可以包含任一消息(在一個(gè)<x/>子元素內(nèi)),感覺就像email里的附件一樣。多個(gè)附件可以包含在同一個(gè)消息中。

? 例子:



<message from="sailor@denmark.com" to="horatio@denmark.com">

<body>URL Attached.</body>

<x xmlns="jabber:x:oob">

<url>http://denmark.com/act4/letter-1.html</url>

<desc>There’s a letter for you sir</desc>

</x>

</message>

6.24. jabber:x:roster——內(nèi)置的花名冊條目
? 內(nèi)置的花名冊條目使用戶可以在一個(gè)消息中包含花名冊條目,這樣很容易在用戶之間發(fā)送聯(lián)系方式。每一個(gè)花名冊條目都包含在一個(gè)<x/>的一個(gè)<item/>子元素中。這個(gè)<x/>元素一般用在一個(gè)<message/>元素中,但這不是必須的。

? 例子:



<message to="hamlet@denmark.com">

<body>

Here are some new Jabber users

to add to your contact list!

</body>

<x xmlns="jabber:x:roster">

<item jid="claudius@denmark.com" name="King">

<group>Royalty</group>

</item>

<item jid="horatio@denmark.com" name="Horatio">

<group>Friends</group>

</item>

<item jid="fortinbras@norway" name="Prince Fortinbras"/>

</x>

</message>

6.25. jabber:x:signed——有符號的當(dāng)前狀態(tài)
? 有符號的當(dāng)前狀態(tài)名字空間用來支持交換使用公共密鑰(客戶端使用PGP或GPG,服務(wù)端使用同樣的名字空間進(jìn)行加密)加密的當(dāng)前狀態(tài)信息。一個(gè)相關(guān)的名字空間,jabber:x:encrypted用來支持加密消息。

? 例子:



<presence from=’juliet@capulet.com/balcony’ to=’romeo@montague.net/orchard’>

<show>away</show>

<status>be back later</status>

<x xmlns=’jabber:x:signed’>

iD8DBQA6kasv0xpc2/POfPkRAnz0AJ9UEYYWWSReddIKk3AYMfTFtqQDJwCfbcLd

JcSUOR0FlS+rDFjAPaSMgSM+iNaNm

</x>

</presence>

6.26. vcard-temp——臨時(shí)vCard
? vCard格式是一個(gè)“電子商務(wù)卡的標(biāo)準(zhǔn)格式,通過使用通過互聯(lián)網(wǎng)進(jìn)行個(gè)人數(shù)據(jù)的直接交換,如同在非互聯(lián)網(wǎng)下的環(huán)境一樣”。由于XML的vCard的格式還沒有標(biāo)準(zhǔn)化,Jabber.org項(xiàng)目在XML的vCard標(biāo)準(zhǔn)建立之前,暫時(shí)設(shè)置了這樣一個(gè)臨時(shí)名字文件。由于這幾年在vCard的XML的官方標(biāo)準(zhǔn)的指定上沒有任何進(jìn)步,Jabber.org開發(fā)者專門為這個(gè)項(xiàng)目創(chuàng)建了一個(gè)項(xiàng)目吸引Jabber社區(qū)外其它開發(fā)者的注意。因此,最后的XML的vCard格式的最后DTD可能會在下面的URL中找到:

http://www.vcard-xml.org/

?

? 例子1(對vCard的客戶端請求):



<iq type="get">

<vCard xmlns="vcard-temp"/>

</iq>



? 例子2(客戶端收到vCard數(shù)據(jù)):



<iq type="result">

<vCard version="3.0" xmlns="vcard-temp">

vCard data goes here

</vCard>

</iq>



? 例子3(客戶端向服務(wù)端發(fā)送vCard):

<iq type="set">

<vCard version="3.0">

vCard data goes here

</vCard>

</iq>

7. 使用用例
? 這一部分提供一些在Jabber協(xié)議上略有不同的觀點(diǎn),通過用例來闡述。下面每一個(gè)例子都展示一個(gè)Jabber用戶完成一個(gè)完整的任務(wù)的消息流程,該流程包括接收和發(fā)送,如注冊到一臺服務(wù)器,登陸,改變當(dāng)前狀態(tài),或者發(fā)送一條消息。如果時(shí)間允許,我將把這部分引申的更遠(yuǎn)。

7.1. Jabber用戶注冊
? 本用例同時(shí)邪顯示Jabber用戶向服務(wù)器開啟一個(gè)socket的連接,以及服務(wù)器的響應(yīng)(如:<stream:stream>標(biāo)簽)。

1. ? Jabber用戶通過開啟一個(gè)從客戶端到服務(wù)器端的XML流,來申請一個(gè)在服務(wù)器上的socket連接。



SEND: <stream:stream

to=’capulet.com’

xmlns=’jabber:client’

xmlns:stream=’http://etherx.jabber.org/streams’>



2. ? 服務(wù)器通過開啟一個(gè)從服務(wù)器到客戶端的XML流進(jìn)行回復(fù)。



RECV: <stream:stream

from=’capulet.com’

id=’180763465’

xmlns=’jabber:client’

xmlns:stream=’http://etherx.jabber.org/streams’>



3. ? Jabber用戶提供一個(gè)需要注冊一個(gè)帳號(理論上,這需要一個(gè)不同的順序:首先詢問服務(wù)器需要什么信息,然后服務(wù)器器告知客戶端需要什么樣的信息;但在實(shí)際中,假定需要的信息是:用戶名,資源,密碼)的信息。



SEND: ? <iq id=’1’ type=’set’>

? ? ? <query xmlns=’jabber:iq:register’>

? ? ? ? ? <username>Juliet</username>

? ? ? ? ? <resource>balcony</resource>

? ? ? </query>

? ? </iq>



4. ? 服務(wù)器響應(yīng)一個(gè)空的類型為”result”的iq元素,表示注冊已成功。



RECV: ? <iq id=’1’ type=’result’/>

7.2. Jabber用戶登陸
1. ? Jabber用戶詢問服務(wù)器,登陸所需要提供的信息。



SEND: <iq id=’2’ type=’get’>

? ? ? <query xmlns=’jabber:iq:auth’>

? ? ? ? <username>Juliet</username>

? ? ? </query>

? ? </iq>



2. ? 服務(wù)器提示Jabber用戶登陸所需要的信息。



RECV: <iq id=’2’ type=’result’>

? ? ? <query xmlns=’jabber:iq:auth’>

? ? ? ? <username>Juliet</username>

? ? ? ? <password/>

? ? ? ? <digest/>

? ? ? ? <sequence>500<sequence/>

? ? ? ? <token>3B905BFD</token>

? ? ? ? <resource/>

? ? ? </query>

? ? </iq>



3. ? Jabber用戶提供所需的信息——在本例中,是一個(gè)<hash/>元素,它是對信息進(jìn)行一個(gè)零度知識認(rèn)證的一個(gè)哈希。(詳情請見http://docs.jabber.org/draft-proto/html/zerok.html)。



SEND: <iq id=’3’ type=’set’>

? ? ? <query xmlns=’jabber:iq:auth’>

? ? ? ? <username>Juliet</username>

? ? ? ? <resource>balcony</resource>

? ? ? ? ? ? ? ? <hash>77d7eacde5e56b9622d0a075cb88361b110f

b9d7</hash>

? ? ? ? ? ? ? </query>

? ? ? ? ? ? </iq>



4. ? 服務(wù)器響應(yīng)一個(gè)空的類型為”result”的iq元素,表明登陸成功。



RECV: <iq id=’3’ type=’result’/>



5. ? Jabber用戶發(fā)送當(dāng)前狀態(tài)給服務(wù)器,表明其在線。



SEND: <presence>

? ? ? <status>Online</status>

? ? </presence>

7.3. Jabber用戶增加一個(gè)聯(lián)系人
1. ? Jabber客戶端在花名冊上增加一個(gè)聯(lián)系人(只是預(yù)備的操作)。



SEND: <iq type=’set’>

? ? ? <query xmlns=’jabber:iq:roster’>

? ? ? ? <item jid=’romeo@montague.net

Name=’remeo’/>

? ? ? ? ? ? ? </query>

? ? ? ? ? ? </iq>



2. ? Jabber用戶發(fā)送一個(gè)對該聯(lián)系人的訂閱請求。



SEND: <presence to’remeo@montague.net’ type=’subscribe’>

? ? ? <status>Wherefore are thou?</status>

? ? </presence>



3. ? 服務(wù)器發(fā)送一個(gè)花名單推送給用戶一個(gè)新條目和一個(gè)類型為”none”的訂閱(早已有了該訂閱)。



RECV: <iq type=’set’>

? ? ? <query xmlns=’jabber:iq:roster’>

? ? ? ? <item jid=’romeo@montague.net

name=’romeo’

subscription=’none’/>

? ? ? ? ? ? ? </query>

? ? ? ? ? ? </iq>



4. ? 服務(wù)器發(fā)送一個(gè)類型為”result”的iq包,表示花名冊推送成功(讓人有點(diǎn)疑惑的是,這個(gè)包是從Jabber用戶發(fā)送到Jabber用戶的?。?br />


RECV: <iq

from=’juliet@capulet.com/balcony’

to=’julie@capulet.com/balcony’

type=’result’>



5. ? 服務(wù)器發(fā)送另一個(gè)花名單推送,這次是ask=’subscribe’屬性,表示訂閱的狀態(tài)未定。



RECV: <iq type=’set’>

? ? ? <query xmlns=’jabber:iq:roster’>

? ? ? ? <item

ask=’subscribe’

jid=’romeo@montague.net

name=’romeo’

subscription=’none’/>

? ? ? ? ? ? ? </query>

? ? ? ? ? ? </iq>



6. ? Romeo對訂閱請求的下一個(gè)響應(yīng)會是什么呢?現(xiàn)在我們假定訂閱以Romeo接受訂閱請求為“結(jié)束”的。



RECV: <presence

from=’romeo@montague.net

to=’juliet@capulet.com

type=’subscribed’/>



7. ? 服務(wù)器再次發(fā)送一個(gè)花名單推送給客戶端,這次subscription=’to’,表示訂閱請求被接受了(Juliet現(xiàn)在可以訂閱到Romeo的當(dāng)前狀態(tài)了)。



RECV: <iq type=’set’>

? ? ? <query xmlns=’jabber:iq:roster’>

? ? ? ? <item

jid=’romeo@montague.net

name=’romeo’

subscription=’to’/>

? ? ? ? ? ? ? </query>

? ? ? ? ? ? </iq>

7.4. Jabber用戶獲得花名冊
? ? ? SEND: <iq type=’get’>

? ? ? ? ? ? ? <query xmlns=’jabber:iq:roster’/>

? ? ? ? ? ? </iq>



RECV:<iq from=’juliet@capulet.com/balcony’ type=’result’> ?

? ? ? ? ? ? ? <query xmlns=’jabber:iq:roster’>

? ? ? ? ? ? ? ? <item

jid=’romeo@montague.net

name=’romeo’

subscription=’both’/>

? ? ? ? ? ? ? </query>

? ? ? ? ? ? </iq>

7.5. Jabber用戶發(fā)送一條消息
? ? ? SEND: <message to’romeo@montague.net’>

? ? ? ? ? ? ? <body>Wherefore are thou?</body>

? ? ? ? ? ? </message>

? 注意:服務(wù)器會根據(jù)Jabber用戶的會話信息加上一個(gè)源地址,這樣接收者收到消息時(shí),消息中已經(jīng)包含了源地址。

7.6. Jabber用戶改變當(dāng)前狀態(tài)
? ? SEND: <presence>

? ? ? ? ? ? <status>stepped away…</status>

? ? ? ? ? ? <show>away</show>

? ? ? ? </presence>

7.7. Jabber用戶登出
? 登出時(shí)很容易的,只需要關(guān)閉<stream>……



? ? SEND: </stream:stream>

? ? RECV: </stream:stream>

8. 參考文獻(xiàn)
? 本協(xié)議參考以下文獻(xiàn)

l ? ? ? Jabber開發(fā)指南(http://docs.jabber.org/jpg/

l ? ? ? Jabber協(xié)議――標(biāo)準(zhǔn)(http://docs.jabber.org/proto/

l ? ? ? Jabber協(xié)議――草案(http://docs.jabber.org/draft-proto/

l ? ? ? Romeo and Juliet

(http://tech-two.mit.edu/Shakespeare/Tragedy/romoandjuliet/full.html)

9. 結(jié)束語
? 本文檔提供了一個(gè)關(guān)于Jabber的XML協(xié)議的一個(gè)詳細(xì)的怪?jǐn)?shù)。如果你對本文檔有任何問題,請通過email或Jabber的方式自由地與作者聯(lián)系(Peter Saint-Andre),他的帳號時(shí)stpeter@jabber.org。

10. 版權(quán)信息
This document is copyright 2001 by Peter Saint-Andre.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (http://www.gnu.org/copyleft/fdl.html),

Version 1.1 or any later version published by the Free Software Foundation, with no

Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You may obtain a

copy of the GNU Free Documentation License from the Free Software Foundation by

visiting http://www.fsf.org/ or by writing to:

The Free Software Foundation, Inc.

59 Temple Place - Suite 330

Boston, MA 02111-1307

USA

附錄 A 標(biāo)準(zhǔn)錯(cuò)誤代碼
? 下面是Jabber中錯(cuò)誤代碼的一些簡要描述。Jabber服務(wù)器在碰到不同的錯(cuò)誤條件下生成這些錯(cuò)誤代碼。一般Jabber錯(cuò)誤代碼以HTTP規(guī)格的RFC 2616(http://www.ietf.org/rfc/rfc2616.txt)為基礎(chǔ)。但Jabber沒有使用所有的HTTP的錯(cuò)誤代碼,并且Jabber錯(cuò)誤代碼與HTTP錯(cuò)誤代碼相對應(yīng)時(shí),通常只有Jabber自己的含義。注意本附錄只包含Jabber服務(wù)器生成的錯(cuò)誤代碼,而不包括服務(wù)器端組件如網(wǎng)關(guān)發(fā)到外部消息系統(tǒng)。



錯(cuò)誤代碼
描述
注意

302
重定向
盡管HTTP規(guī)定中包含八種不同代碼來表示重定向,Jabber只用了其中一個(gè)(用來代替所有的重定向錯(cuò)誤)。不過Jabber代碼302是為以后的功能預(yù)留的,目前還沒有用到

400
壞請求
Jabber代碼400用來通知Jabber客戶端,一個(gè)請求因?yàn)槠湓愀獾恼Z法不能被識別。例如,當(dāng)一個(gè)Jabber客戶端發(fā)送一個(gè)的訂閱請求給它自己活發(fā)送一條沒有包含“to”屬性的消息,Jabber代碼400就會產(chǎn)生。

401
未授權(quán)的
Jabber代碼401用來通知Jabber客戶端它們提供的是錯(cuò)誤的認(rèn)證信息,如,在登陸一個(gè)Jabber服務(wù)器時(shí)使用一個(gè)錯(cuò)誤的密碼,或未知的用戶名。

402
所需的費(fèi)用
Jabber代碼402為未來使用進(jìn)行保留,目前還不用到。

403
禁止
Jabber代碼403被Jabber服務(wù)器用來通知Jabber客戶端該客戶端的請求可以識別,但服務(wù)器拒絕執(zhí)行。目前只用在注冊過程中的密碼存儲失敗。

404
沒有找到
Jabber代碼404用來表明Jabber服務(wù)器找不到任何與JabberID匹配的內(nèi)容,該JabberID是一個(gè)Jabber客戶端發(fā)送消息的目的地。如,一個(gè)用戶打算向一個(gè)不存在的JabberID發(fā)送一條消息。如果接受者的Jabber服務(wù)器無法到達(dá),將發(fā)送一個(gè)來自500級數(shù)的錯(cuò)誤代碼。

405
不允許的
Jabber代碼405用在不允許操作被’from’地址標(biāo)識的JabberID。例如,它可能產(chǎn)生在,一個(gè)非管理員用戶試圖在服務(wù)器上發(fā)送一條管理員級別的消息,或者一個(gè)用戶試圖發(fā)送一臺Jabber服務(wù)器的時(shí)間或版本,或者發(fā)送一個(gè)不同的JabberID的vCard。

406
不被接受的
Jabber代碼406用于服務(wù)器因?yàn)槟承├碛刹唤邮芤粋€(gè)包。例如,這個(gè)可能發(fā)生在,一個(gè)Jabber客戶端試圖使用jabber:iq:private在服務(wù)器上存儲信息,但當(dāng)前的用于存儲的名字空間用”jabber:”開頭(在Jabber里是一個(gè)被存的XML開頭)。另一種可能產(chǎn)生406錯(cuò)誤的情況是當(dāng)一個(gè)Jabber客戶端試圖用一個(gè)空密碼注冊到一臺Jabber服務(wù)器上。

407
必須注冊
Jabber代碼407當(dāng)前不被使用

408
注冊超時(shí)
當(dāng)一個(gè)Jabber客戶端不能在服務(wù)器準(zhǔn)備好的時(shí)間內(nèi)發(fā)起一個(gè)請求時(shí),Jabber服務(wù)器生成Jabber代碼408。這個(gè)代碼當(dāng)前只用于Jabber會話管理器使用的零度認(rèn)證模式中。

409
沖突


500
服務(wù)器內(nèi)部錯(cuò)誤
當(dāng)一臺Jabber服務(wù)器遇到一種預(yù)期外的條件,該條件阻止服務(wù)器處理來自Jabber客戶端的包,這是將用到Jabber代碼500?,F(xiàn)在,唯一會引發(fā)500錯(cuò)誤代碼的時(shí)間是當(dāng)一個(gè)Jabber客戶端試圖通過服務(wù)器認(rèn)證,而該認(rèn)證因?yàn)槟承┰驔]有被處理(如無法保存密碼)。

501
不可執(zhí)行
當(dāng)服務(wù)器不支持Jabber客戶端請求的功能,使用Jabber代碼501。例如,該代碼只當(dāng)Jabber客戶端發(fā)送一個(gè)認(rèn)證請求,而該認(rèn)證請求不包含服務(wù)器配置中定義的任何一種認(rèn)證方式時(shí),服務(wù)器發(fā)送Jabber代碼501。這個(gè)代碼還被用于,當(dāng)一個(gè)Jabber客戶端試圖注冊一個(gè)不允許注冊的服務(wù)器。

502
遠(yuǎn)程服務(wù)器錯(cuò)誤
當(dāng)因?yàn)闊o法到達(dá)遠(yuǎn)程服務(wù)器導(dǎo)致轉(zhuǎn)發(fā)一個(gè)包失敗時(shí),使用Jabber代碼502。該代碼發(fā)送的特殊例子包括一個(gè)遠(yuǎn)程服務(wù)器的連接的失敗,無法獲取遠(yuǎn)程服務(wù)器的主機(jī)名,以及遠(yuǎn)程服務(wù)器錯(cuò)誤導(dǎo)致的外部時(shí)間過期。

503
服務(wù)無法獲得
當(dāng)一個(gè)Jabber客戶端請求一個(gè)服務(wù),而Jabber服務(wù)器通常由于一些臨時(shí)原因無法提供該服務(wù)時(shí),使用Jabber代碼503。例如,一個(gè)Jabber客戶端試圖發(fā)送一條消息給另一個(gè)用戶,該用戶不在線,但它的服務(wù)器不提供離線存儲服務(wù),服務(wù)器將返回一個(gè)503錯(cuò)誤代碼給發(fā)送消息的JabberID。當(dāng)為vcard-temp和jabber:iq:private名字空間設(shè)置信息時(shí),出現(xiàn)通過xdb進(jìn)行數(shù)據(jù)存儲的寫入錯(cuò)誤,也使用該代碼。

504
遠(yuǎn)程服務(wù)器超時(shí)
Jabber代碼504用于下列情況:試圖連接一臺服務(wù)器發(fā)生超時(shí),錯(cuò)誤的服務(wù)器名。

510
連接失敗
Jabber代碼510目前還沒有使用。


源文:http://www.blogjava.net/codefans/articles/20022.html
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            毛片基地黄久久久久久天堂| 久久视频这里只有精品| 欧美在线视频导航| 亚洲资源在线观看| 国产精品白丝黑袜喷水久久久| 日韩手机在线导航| 性欧美videos另类喷潮| 亚洲承认在线| 乱人伦精品视频在线观看| 国产亚洲成av人在线观看导航| 免费观看成人网| 欧美成人亚洲成人日韩成人| 亚洲欧美激情一区二区| 亚洲欧美在线一区| 日韩一区二区精品葵司在线| 久久一区中文字幕| 久久久999精品免费| 国产欧美一区二区三区国产幕精品| 久久综合精品国产一区二区三区| 在线亚洲自拍| 久久综合给合久久狠狠狠97色69| 久久久国产一区二区三区| 国产一级揄自揄精品视频| 亚洲精品视频一区二区三区| 久久综合婷婷| 亚洲精品美女91| 欧美日本高清| 午夜精品www| 欧美福利视频| 欧美一区午夜视频在线观看| 午夜久久tv| 亚洲国产高清在线| 日韩亚洲欧美成人| 久久久青草青青国产亚洲免观| 欧美自拍偷拍午夜视频| 久久综合99re88久久爱| 亚洲日本理论电影| 加勒比av一区二区| 国产日韩欧美不卡在线| 亚洲高清三级视频| 亚洲性感激情| 亚洲欧美日韩视频二区| 欧美精品网站| 久久不射中文字幕| 亚洲精品久久嫩草网站秘色 | 国产亚洲亚洲| 久久久久久亚洲精品不卡4k岛国| 亚洲综合视频1区| 国产自产高清不卡| 亚洲夫妻自拍| 一本色道婷婷久久欧美| 国产色产综合色产在线视频| 久久久久成人精品| 亚洲视频在线一区| 欧美黄色大片网站| 日韩午夜电影| 亚洲黄色免费电影| 精品9999| 国产精品稀缺呦系列在线| 黑人巨大精品欧美一区二区小视频 | 亚洲自拍偷拍一区| 欧美日韩不卡| 国产精品女主播| 欧美国产成人在线| 久久丁香综合五月国产三级网站| 亚洲免费一级电影| 亚洲激情视频在线播放| 国产亚洲精品激情久久| 国产日产欧产精品推荐色| 久久免费视频在线观看| 性欧美激情精品| 久久亚洲综合色| 欧美国产日韩一区| 欧美激情精品久久久久| 欧美sm极限捆绑bd| 亚洲精品1区2区| 免费观看成人| 亚洲欧美中日韩| 亚洲第一在线视频| 午夜精品久久久久| 亚洲免费视频成人| 欧美大片在线观看| 亚洲午夜av在线| 欧美精品一区二区久久婷婷| 极品尤物av久久免费看 | 欧美新色视频| 在线看视频不卡| 亚洲素人在线| 亚洲欧美日本日韩| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲一区二区视频在线| 久久久久综合网| 久久久久久亚洲综合影院红桃| 欧美吻胸吃奶大尺度电影| 欧美色图首页| 亚洲国产91| 国产精品第一页第二页第三页| 久久蜜臀精品av| 国产日韩一区| 美女视频黄免费的久久| 欧美综合国产精品久久丁香| 永久91嫩草亚洲精品人人| 亚洲欧美日韩国产综合| 久久婷婷蜜乳一本欲蜜臀| 久久激情五月激情| 亚洲精选中文字幕| 欧美成人精品一区二区| 国产精品亚洲人在线观看| 亚洲一二三四区| 99精品视频一区二区三区| 在线精品国精品国产尤物884a| 欧美freesex8一10精品| 欧美激情在线| 午夜久久福利| 久久精品麻豆| 99成人精品| 久久婷婷综合激情| 国产精品一二三| 一区二区三区精品| 久久久国产午夜精品| 亚洲免费av网站| 亚洲国产一区视频| 欧美理论电影网| 亚洲午夜精品一区二区| 亚洲综合视频网| 最新亚洲视频| 久久婷婷综合激情| 免费亚洲网站| 国产一区二区三区奇米久涩| 亚洲三级观看| 亚洲精品美女91| 久久精品亚洲一区二区| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲图片欧美一区| 久久久一二三| 久久久久国产一区二区三区| 国产婷婷色一区二区三区| 亚洲精品国偷自产在线99热| 欧美日韩免费观看一区=区三区| 亚洲欧美日产图| 国产精品久久久久久久久久尿| 亚洲欧美日韩精品久久久久| 欧美极品在线播放| 一区二区精品在线| 亚洲欧美精品伊人久久| 亚洲国产成人在线视频| 久久久久久久欧美精品| 午夜精品亚洲| 亚洲成人直播| 久久麻豆一区二区| 欧美国产专区| 日韩一级不卡| 国产色产综合产在线视频| 免费欧美视频| 亚洲精品美女久久7777777| 亚洲精品久久久久久久久久久久久| 亚洲国产精品www| 国产一区亚洲一区| 久久久噜噜噜久噜久久| 久久免费高清视频| 亚洲欧美激情视频| 久久精品欧美日韩精品| 亚洲成色www8888| 欧美亚洲自偷自偷| 欧美亚洲一区二区在线观看| 久久er99精品| 鲁大师影院一区二区三区| 亚洲毛片在线观看.| 蜜桃av噜噜一区| 欧美日韩午夜| 久久国产主播精品| 久久精品五月| 欧美一级电影久久| 久久精品国产欧美亚洲人人爽| 午夜激情久久久| 久久亚裔精品欧美| 国产欧美一区二区色老头| 亚洲福利小视频| 麻豆成人在线观看| 一区二区三区四区五区精品视频| 猫咪成人在线观看| 久久久久久亚洲综合影院红桃| 欧美福利视频| 一本色道久久综合亚洲精品不卡| 久久只精品国产| 欧美激情一区二区三区在线视频| 亚洲欧洲日产国产综合网| 亚洲亚洲精品三区日韩精品在线视频 | 久久久中精品2020中文| 久久久xxx| 欧美视频一区二区在线观看 | 亚洲国产岛国毛片在线| 午夜视频在线观看一区二区| 亚洲美女av网站| 一本色道久久综合亚洲91| 一本色道久久88亚洲综合88| 亚洲欧美成人一区二区三区| 欧美在线视频免费播放| 久久成人av少妇免费| 麻豆久久婷婷|