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

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

            如有恒,何須三更起,半夜眠;最怕莫,三天打魚兩天曬網(wǎng),竹籃打水一場(chǎng)空!
            posts - 31, comments - 23, trackbacks - 0, articles - 30
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            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ò)展。本文檔將對(duì)Jabber服務(wù)器1.4版的Jabber協(xié)議進(jìn)行介紹。

            ? 在XML上下文的數(shù)據(jù)流中,Jabber開放的XML協(xié)議包括三個(gè)頂級(jí)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)的信息,請(qǐng)查看名為Jabber技術(shù)概述的文檔(http://docs.jabber.org/general/html/overview.html)。

            2. XML流
            ? 一個(gè)Jabber會(huì)話由兩個(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ù)器才會(huì)同意用戶會(huì)話進(jìn)行工作。

            3. <message/>元素
            ? <message/>元素是Jabber開放XML協(xié)議三個(gè)頂級(jí)元素中的一個(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對(duì)一個(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)志。總得來說,Jabber ID的”from”必須是user@host/resource的格式。從XML的觀點(diǎn)來說,這個(gè)屬性必須包含于所有的<message/>元素中,為了對(duì)付一些欺騙,實(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客戶端或客戶庫(kù)(類似WinJab或JabberCOM),生成,客戶端用它來為跟蹤消息(比如將發(fā)送到一個(gè)群組聊天室的信息和從這個(gè)聊天室收到的消息相關(guān)聯(lián),或?qū)⒁粋€(gè)消息與它可能產(chǎn)生的錯(cuò)誤相關(guān)聯(lián))進(jìn)行標(biāo)識(shí)。“id”屬性是可選的,并且在系統(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ā)送離線存儲(chǔ)器。這個(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é),請(qǐng)看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ā)送者和接收者對(duì)回復(fù)進(jìn)行認(rèn)證并創(chuàng)建一個(gè)對(duì)話線程。下面的是例子:

            <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ā)送者可以立即收到消息。“不可用”狀態(tài)表示發(fā)送者不能在當(dāng)前時(shí)間收到任何數(shù)據(jù)。默認(rèn)情況下,所有<presence/>元素除非包含type=”unavailable”屬性外,都表示“可用”。“可用”的更多特殊形勢(shì)通過<status/>和<show/>子元素進(jìn)行指定。

            4.1. “type”屬性
            ? <presence/>的“type”屬性根據(jù)不同目的使用。除了提示其它用戶本用戶的可用性狀態(tài)的“普通”用法外,還包括訂閱、取消訂閱、以及探測(cè)在線狀態(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)先級(jí)。

            ? 例子:



            ? <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)離開很長(zhǎng)時(shí)間了(“xa”表示“extended away”)

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

            ? 探測(cè)請(qǐng)求的例子:

            ?

            ? <presence

            from="romeo@montague.net"

            to="juliet@capulet.com"

            type="probe"/>



            ? 回復(fù)探測(cè)請(qǐng)求的例子:



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

            ? 例子:



            ? <presence

            from="romeo@montague.net"

            to="juliet@capulet.com"

            type="subscribe"/>



            4.1.5. type=”subscribed”
            ? 發(fā)送一個(gè)消息,表明發(fā)送者接受了接受者對(duì)其再現(xiàn)狀態(tài)訂閱的請(qǐng)求。從現(xiàn)在起,當(dāng)發(fā)送者的在線狀態(tài)信息改變時(shí),服務(wù)器將會(huì)把狀態(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è)請(qǐng)求,表明接收者停止發(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)信息的請(qǐng)求的通知。服務(wù)器將不再發(fā)送發(fā)送者的在線狀態(tài)信息給接收者。

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

            例子:



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

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

            ? 例子:



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

            4.2.3. “to”屬性
            ? 標(biāo)識(shí)在線狀態(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ā)送到該用戶花名冊(cè)上所有的用戶。當(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)先級(jí)(通過對(duì)指派給該資源的Jabber客戶端進(jìn)行設(shè)置),這個(gè)優(yōu)先級(jí)與<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)先級(jí)的資源不可用,消息和其它Jabber通信將發(fā)送給次高優(yōu)先級(jí)的資源(當(dāng)其它資源都不可用時(shí),一個(gè)沒有從默認(rèn)數(shù)到0的優(yōu)先級(jí)的客戶端,也可以成為第一資源)

            ? 舉例來說,Julie可以通過兩個(gè)資源:the balcony 和 the chamber連接她的帳號(hào)juliet@capulet.com。如果“balcony”資源的優(yōu)先級(jí)被設(shè)置為“2”,而“chamber”資源的優(yōu)先級(jí)被設(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>
            該客戶在線,但剛剛離開(如吃午飯,開會(huì))

            <show>xa</show>
            該客戶在線,但已經(jīng)處于非活動(dòng)狀態(tài)很長(zhǎng)時(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è)根本的會(huì)話,并且允許實(shí)體間來回傳送XML格式的請(qǐng)求和響應(yīng)。信息/查詢主要的用處是取得或設(shè)置公共的用戶信息,比如名字,電子郵件,地址等等。但它的靈活設(shè)計(jì)使得任何種類的會(huì)話都可以發(fā)生。任何通過一個(gè)Jabber ID標(biāo)識(shí)的實(shí)體都能通過一個(gè)IQ與其它實(shí)體進(jìn)行會(huì)話。

            5.1. “type”屬性
            ? <iq/>元素的“type”屬性用于決定信息/查詢是請(qǐng)求還是響應(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/>包是對(duì)設(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)識(shí)。Jabber客戶端或客戶庫(kù)生成“id”屬性,客戶端通過它來標(biāo)識(shí)<iq/>包,以完成對(duì)<iq/>包的跟蹤(如:一個(gè)type=”result”對(duì)應(yīng)一個(gè)type=”get”或type=”set”)。“id”屬性是可選的,并且不能用于系統(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客戶端,對(duì)應(yīng)“to”屬性的Jabber ID的格式為user@host/resource。user@host也是可以的,如果用戶在線,user@host將被置換成user@host/resource,如果用戶不在線,user@host將被直接指向一個(gè)離線模塊(對(duì)于類似服務(wù)器端網(wǎng)關(guān)這種非用戶實(shí)體,情況又有所不同,因?yàn)樗鼈儾粨碛匈Y源,并且只是簡(jiǎn)單通過Jabber ID的一個(gè)“server”端口進(jìn)行標(biāo)識(shí)。Jud.jabber.org——Jabber用戶目錄就是這樣一個(gè)例子)。如果<iq/>包沒有<to>屬性,服務(wù)器將對(duì)該包進(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è)壞請(qǐng)求:

            ?

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

            ?

            ? 在附錄中,列有錯(cuò)誤編碼及其對(duì)應(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>給客戶端。客戶端在返回<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:*名字空間對(duì)Jabber核心進(jìn)行擴(kuò)展。這些將在下面的名字空間中進(jìn)行更完整的描述。

            一個(gè)空<query/>子元素可以與<iq type=”get”>元素一起發(fā)送,這樣可以找回與<query/>子元素中指定的名字空間相關(guān)的一個(gè)Jabber實(shí)體的信息。比如,找回一個(gè)客戶端的花名冊(cè)(“聯(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——簡(jiǎn)單用戶認(rèn)證

            l ? ? ? jabber:iq:autoupdate——版本更新申請(qǐng)

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

            l ? ? ? jabber:iq:conference——一般會(huì)議

            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ù)存儲(chǔ)

            l ? ? ? jabber:iq:register——注冊(cè)請(qǐng)求

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

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

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

            l ? ? ? jabber:iq:version——客戶端版本

            l ? ? ? jabber:x:autoupdate——版本通知申請(qǐng)

            l ? ? ? jabber:x:conference——會(huì)議邀請(qǐng)

            l ? ? ? jabber:x:delay——顯示的對(duì)象

            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)部的花名冊(cè)條目

            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查詢通常用于注冊(cè)到一個(gè)指定的服務(wù)、代理、傳輸器。

            ? 它也可能檢驗(yàn)一個(gè)指定代理的所有工具細(xì)節(jié)。比如,一個(gè)客戶端可以決定一個(gè)開放的注冊(cè)是否可以進(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ù)情況下,可用代理列表是用來顯示一臺(tái)服務(wù)器上的可用傳輸器列表。

            ? 注意:這個(gè)名字空間被jabber:iq:browse的支持者所反對(duì)(??)。

            ? 例子:



            ? <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——簡(jiǎn)單客戶端認(rèn)證
            簡(jiǎn)單客戶認(rèn)證名字空間是對(duì)客戶端進(jìn)行認(rèn)證的一個(gè)簡(jiǎn)單機(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——版本更新申請(qǐng)
            ? 版本更新申請(qǐng)名字空間允許客戶端對(duì)所有可用軟件更新進(jìn)行申請(qǐng)請(qǐng)求。

            ? 例子:

            <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è)模擬類型的概念)。下面是想象中的最高級(jí)別的jid-types,不過隨著時(shí)間的推移,一些其它的邏輯將被增加進(jìn)來:

            l ? ? ? 應(yīng)用

            l ? ? ? 會(huì)議

            l ? ? ? 標(biāo)題

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

            l ? ? ? 回報(bào)

            l ? ? ? 服務(wù)

            l ? ? ? 用戶

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

            Jabber:iq:browse的一個(gè)用戶就是代替jabber:iq:agents名字空間來列出一個(gè)服務(wù)器上所對(duì)應(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>



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

            1. ? 想要加入的房間提交一個(gè)type=”get”的請(qǐng)求。這個(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>



            這里所有的請(qǐng)求元素的子元素都是可選的。昵稱(nickname)元素表示進(jìn)入房間需要一個(gè)昵稱。密鑰(secret)元素表示進(jìn)入房間的用戶需要提供一個(gè)密碼。獨(dú)處(privacy)元素表示如果用戶在一個(gè)type=”set”(下面可以看到例子)的iq包中提供這樣的元素,會(huì)議服務(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號(hào)是用戶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變得很容易。這些通過對(duì)用戶進(jìn)行提示和會(huì)話,引導(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è)包含請(qǐng)求批準(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è)客戶最后一次連接(或活動(dòng))到一臺(tái)服務(wù)器上的時(shí)間。每一次返回的值都是一個(gè)秒的數(shù)目。進(jìn)行查詢的實(shí)體可以通過下面的法則解釋獲取的信息:

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

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

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

            ? 例子1(客戶端存儲(chǔ)私有數(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>



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

            例子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——注冊(cè)請(qǐng)求
            注冊(cè)請(qǐng)求名字空間對(duì)一個(gè)或多個(gè)服務(wù)進(jìn)行注冊(cè)。它也被用來更新或刪除一個(gè)注冊(cè)。

            例子:

            <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)系人名單管理名字空間是客戶端用來管理他們的花名冊(cè)的,該花名冊(cè)保存在服務(wù)器上,這樣用戶可以在任何地方得到它。花名冊(cè)是該帳號(hào)上所有訂閱信息的命令列表,包括用戶昵稱和聯(lián)系列表。當(dāng)用戶從任何一個(gè)資源登陸上來,服務(wù)器將把花名冊(cè)發(fā)送給用戶。

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

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

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

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

            l ? ? ? “name”表示昵稱

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

            訂閱請(qǐ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è)花名冊(cè)條目在服務(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è)花名冊(cè),表明該用戶對(duì)romeo@montague.net的當(dāng)前狀態(tài)信息有訂閱。一個(gè)花名冊(cè)推送可能發(fā)生一個(gè)連接的任何時(shí)間中,該連接是另一個(gè)連接修改資源或服務(wù)器(修改訂閱屬性)的結(jié)果。客戶端只有使用花名冊(cè)推送來改變花名冊(cè)的顯示。但不是每次花名冊(cè)推送都對(duì)用戶起作用。

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

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



            <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è)密鑰(下面會(huì)看到)。用戶現(xiàn)在可以在允許的域內(nèi)進(jìn)行標(biāo)準(zhǔn)的查詢了。用戶發(fā)回一個(gè)Set請(qǐng)求給代理進(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)簽,類似花名冊(cè)推送,如在一個(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)用程序版本通知
            ? 版本更改申請(qǐ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——會(huì)議邀請(qǐng)
            ? 會(huì)議邀請(qǐng)名字空間使用戶可以邀請(qǐng)其它Jabber用戶到指定會(huì)議室。相關(guān)聯(lián)信息——該會(huì)議室的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)記對(duì)象延時(shí)
            ? 標(biāo)記對(duì)象延時(shí)名字空間是消息和當(dāng)前狀態(tài)信息的時(shí)間戳信息,其中,當(dāng)一個(gè)Jabber實(shí)體不在線時(shí),當(dāng)前狀態(tài)信息可以保存并在稍后發(fā)送。當(dāng)實(shí)體上線時(shí),包含的信息標(biāo)記對(duì)象延時(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)識(shí)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)識(shí)一條消息的狀態(tài)的一個(gè)機(jī)制。現(xiàn)在,事件與一條消息如下般相關(guān)聯(lián):

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

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

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

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

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

            對(duì)消息通知的請(qǐng)求的例子:



            <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í)請(qǐng)求多個(gè)消息事件。

            6.22. jabber:x:expire——消息到期
            ? 消息到期名字空間是說明一條消息擁有一個(gè)有限的存活事件的一個(gè)簡(jiǎn)單擴(kuò)展。如果消息被離線存儲(chǔ),而到了到期時(shí)間,服務(wù)器將不再發(fā)送該消息。如果一條消息為預(yù)覽就進(jìn)行發(fā)送,Jabber客戶端可以選擇不顯示該消息。“secondes”屬性定義消息發(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ù)哪侩姟J褂胘abber: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)置的花名冊(cè)條目
            ? 內(nèi)置的花名冊(cè)條目使用戶可以在一個(gè)消息中包含花名冊(cè)條目,這樣很容易在用戶之間發(fā)送聯(lián)系方式。每一個(gè)花名冊(cè)條目都包含在一個(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——有符號(hào)的當(dāng)前狀態(tài)
            ? 有符號(hào)的當(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可能會(huì)在下面的URL中找到:

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

            ?

            ? 例子1(對(duì)vCard的客戶端請(qǐng)求):



            <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ā)送,如注冊(cè)到一臺(tái)服務(wù)器,登陸,改變當(dāng)前狀態(tài),或者發(fā)送一條消息。如果時(shí)間允許,我將把這部分引申的更遠(yuǎn)。

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

            1. ? Jabber用戶通過開啟一個(gè)從客戶端到服務(wù)器端的XML流,來申請(qǐng)一個(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è)需要注冊(cè)一個(gè)帳號(hào)(理論上,這需要一個(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元素,表示注冊(cè)已成功。



            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/>元素,它是對(duì)信息進(jìn)行一個(gè)零度知識(shí)認(rèn)證的一個(gè)哈希。(詳情請(qǐng)見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客戶端在花名冊(cè)上增加一個(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è)對(duì)該聯(lián)系人的訂閱請(qǐng)求。



            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包,表示花名冊(cè)推送成功(讓人有點(diǎn)疑惑的是,這個(gè)包是從Jabber用戶發(fā)送到Jabber用戶的!)



            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對(duì)訂閱請(qǐng)求的下一個(gè)響應(yīng)會(huì)是什么呢?現(xiàn)在我們假定訂閱以Romeo接受訂閱請(qǐng)求為“結(jié)束”的。



            RECV: <presence

            from=’romeo@montague.net

            to=’juliet@capulet.com

            type=’subscribed’/>



            7. ? 服務(wù)器再次發(fā)送一個(gè)花名單推送給客戶端,這次subscription=’to’,表示訂閱請(qǐng)求被接受了(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用戶獲得花名冊(cè)
            ? ? ? 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ù)器會(huì)根據(jù)Jabber用戶的會(huì)話信息加上一個(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é)束語(yǔ)
            ? 本文檔提供了一個(gè)關(guān)于Jabber的XML協(xié)議的一個(gè)詳細(xì)的怪?jǐn)?shù)。如果你對(duì)本文檔有任何問題,請(qǐng)通過email或Jabber的方式自由地與作者聯(lián)系(Peter Saint-Andre),他的帳號(hào)時(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ò)誤代碼的一些簡(jiǎn)要描述。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ò)誤代碼相對(duì)應(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
            壞請(qǐng)求
            Jabber代碼400用來通知Jabber客戶端,一個(gè)請(qǐng)求因?yàn)槠湓愀獾恼Z(yǔ)法不能被識(shí)別。例如,當(dāng)一個(gè)Jabber客戶端發(fā)送一個(gè)的訂閱請(qǐng)求給它自己活發(fā)送一條沒有包含“to”屬性的消息,Jabber代碼400就會(huì)產(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客戶端該客戶端的請(qǐng)求可以識(shí)別,但服務(wù)器拒絕執(zhí)行。目前只用在注冊(cè)過程中的密碼存儲(chǔ)失敗。

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

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

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

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

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

            409
            沖突


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

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

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

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

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

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


            源文:http://www.blogjava.net/codefans/articles/20022.html
            国产Av激情久久无码天堂 | 狠狠88综合久久久久综合网| 亚洲日本va中文字幕久久| 亚洲熟妇无码另类久久久| 国产精品久久久久无码av| 久久久久99精品成人片| 中文字幕日本人妻久久久免费| 久久久久中文字幕| 亚洲欧洲精品成人久久曰影片 | 国内精品九九久久精品| 久久精品嫩草影院| 久久精品一本到99热免费| 久久精品国产福利国产秒| 久久久亚洲欧洲日产国码是AV| 亚洲午夜久久影院| 日韩人妻无码精品久久久不卡 | 久久精品国产99国产精品导航 | 精品多毛少妇人妻AV免费久久| 中文字幕人妻色偷偷久久| 四虎影视久久久免费| 久久综合久久久| 久久国产精品无码一区二区三区| 无码任你躁久久久久久久| 久久久久久免费一区二区三区 | 亚洲国产精品嫩草影院久久 | 久久青青草原精品国产不卡| 国内精品久久久久久久97牛牛| 久久这里只精品99re66| 国产午夜福利精品久久| 久久精品蜜芽亚洲国产AV| 久久精品国产亚洲AV香蕉| 国产精品久久久久久久app | 精品久久久久久国产| 久久露脸国产精品| 久久亚洲av无码精品浪潮| 亚洲一区中文字幕久久| 青青青青久久精品国产 | 一级做a爰片久久毛片毛片| 国内精品久久久久久久久| segui久久国产精品| 国产91色综合久久免费|