即使聊天相關協(xié)議筆記_第1頁
即使聊天相關協(xié)議筆記_第2頁
即使聊天相關協(xié)議筆記_第3頁
即使聊天相關協(xié)議筆記_第4頁
即使聊天相關協(xié)議筆記_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Jabber 協(xié)議 概述Peter Sa-Andrestpeterjabber.1.4 版Jabber 服務協(xié)議的概述1. 介紹Jabber 是一個由開源社區(qū)發(fā)起并開發(fā)的即時消息和狀態(tài)的系統(tǒng)。Jabber系統(tǒng)和其它即時消息(IM)服務的一個功能上的差別在于 Jabber 擁有開放的XML 協(xié)議。在保持Jabber1.0 版本有關消息以及狀態(tài)的協(xié)議的基礎上,增加了一些必要的擴展。本文檔將對Jabber 服務器 1.4 版的Jabber 協(xié)議進行介紹。在XML 上下文的數據流中,Jabber 開放的XML 協(xié)議包括三個頂級XML 元素:(info/query)每一個元素通過屬性和名字空間包含大量的

2、數據,這些屬性和名字空間都是 Jabber的組成部分(但不包括為特殊應用的名字空間應用)。下面將描述整個Jabber 協(xié)議。如果您想獲得關于Jabber 系統(tǒng)結構的信息,請查看名為Jabber 技術概述的文檔()。2. XML 流一個Jabber 會話由兩個平行的XML 流組成,一個從客戶端到服務器端,另一個從服務端到客戶端。當一個Jabber 客戶端連接上一個Jabber 服務器時,這個客戶端將發(fā)起一個客戶端服務器的XML 流,同時作為響應,服務器也將發(fā)起一個服務器客戶端的XML 流。所有,以及元素都被放在這些XML流的上下文中。下面就有一個例子:SEND:SEND:RECV:(XML fo

3、r user sesgoeshere)*SEND:RECV:*注意:必須等到當一個元素(特別指一個jabber:iq:auth名字空間下的元素)發(fā)送了認證信息后,服務器才會同意用戶會話進行工作。3. 元素元素是Jabber 開放XML 協(xié)議三個頂級元素中的一個。它被用來包含兩個Jabber 用戶間互相發(fā)送消息內容,或者兩個Jabber IDs 之間更一般的消息(因為,通過神奇的傳輸器,另一個 IM 系統(tǒng)可以用Jabber ID 代替,如 HYPERLINK mailto:70902454icq.jabber 70902454icq.jabber.)。3.1. 消息類型“type”屬性Jabbe

4、r 支持幾種不同的消息,這些消息通過的“type”屬性來進行區(qū)分。下面就是“type”屬性的有效值:3.1.1. default(不設置“type”屬性)表示本消息是一個普通消息。默認的情況下,客戶端在沒有設置屬性時,將消息類型定為普通消息。例子:Wherefore art though Romeo?3.1.2.type=”chat”表示消息需要被一個接一個的顯示在聊天界面上(一般是一條接一條的界面,不過實際界面可以被用戶自己定義。)例子:Wherefore art though Romeo?3.1.3.type=”error”表示消息被描述成一個錯誤條件。實際的錯誤在消息中用一個元素來描述。

5、一個元素包括一個和一個。下面的例子將演示,當 Jut 對一個不存在的用戶發(fā)送一個“hi”的消息時,將收到的包體:例子:hiNot Found3.1.4. type=”groupchat”表示本消息需要在一個聊天室的界面中進行顯示。例子:Double, double toil and trouble3.2. 其它屬性除了設置“type”屬性,還可以通過下面的屬性修改元素:3.2.1. “from”屬性消息發(fā)送者的標志??偟脕碚f,Jabber ID 的”from”必須是userhost/resource 的格式。從XML 的觀點來說,這個屬性必須包含于所有的元素中,為了對付一些此,它并不是客戶端開

6、發(fā)者需要關心,實際應用中服務器添加或置換這個屬性。因。例子:Wherefore art thouRomeo?3.2.2. “id”屬性“id”屬性是作為消息的一個唯一標志。它由Jabber 客戶端或客戶庫(類似WinJab 或),生成,客戶端用它來為消息(比如將發(fā)送到一個群組聊天室的信息和從這個聊天室收到的消息相關聯(lián),或將一個消息與它可能產生的錯誤相關聯(lián))進行標識。“id”屬性是可選的,并且在系統(tǒng)的別的方是不可用的。例子:Wherefore art thou Romeo?3.2.3. “to”屬性表示消息的接收者。Jabber ID 的“to”屬性一般是 userhost/resource 格

7、式,userhost 也可以被接受。如果接收者,通過userhost/resource 方式解決,如果用戶不,直接發(fā)送離線器。這個屬性是所有元素必須的。例子:Wherefore art thou Romeo?3.3. 中的素下面的素是用來定義一個Jabber 消息的上下文或數據元。3.3.1. 這個元素包含消息的主要文本。元素只存在于一個元素中,并且只能包含明文。不過,它可以由其它素(如、)。3.3.2. 當消息類型屬性被置為“error”時,這個元素將被使用。錯誤代碼被一個”type”屬性定義,這個”type”屬性包含代碼數,通過元素來包含一個這個錯誤的文本描述。元素必須包含在原始消息的中。

8、下面的例子將演示,當Jut 向一個不存在的用戶發(fā)送“hi”消息后的包體:例子:hiNot Found附文中有代碼與它們所定義的含義表。3.3.3. 元素結合XHTML 名字空間(一個消息提供一個交替的名字空間,就像在),為世界中規(guī)定同時發(fā)送普通文本與HTML版本的郵件消息一樣。這個功能使用的是W3C 開發(fā)的基本XHTML 格式(行細節(jié),請看Jabber 消息的暫定格式規(guī)范(),關于Jabber 在消息中的XHTML 執(zhí)proto/html/xhtml.html)。所有XHTML 的根元素都必須是。這個根元素中,支持任何一個基本XHTML 格式中定義的元素,但不是每一個元素可以通過即時消息的上下

9、文來進行理解。3.3.4. 這是一個可選元素,包含消息的標題。3.3.5. 當一個Jabber 客戶端發(fā)送一個”chat”類型的消息,將生成唯一的線程 ID(通常是由發(fā)送者的Jabber ID 和當前時間生成的一個hash)。消息發(fā)送者和接收者在聊天中后續(xù)的消息都包含一個素,這個素包含原始線程ID。這使得消息發(fā)送者和接收者對回復進行認證并創(chuàng)建一個線程。下面的是例子:AAC96FEFDE226C2C04BE8F2E19A2151BArt thou not Romeo and a Montague?AAC96FEFDE226C2C04BE8F2E19A2151BNeither, fair sa,

10、if either thee dislike.3.3.6. 元素作為一個擴展機制來使用,或發(fā)送從服務器發(fā)送命令給客戶端,或從一個客戶端發(fā)送命令到另一個客戶端。每次用到這個元素時,必須指明相關的 XML 名字空間。單一消息可以包含多個素實例。下列已定義的名字空間可以使用:/素jabber:x:autoupdatejabber:x:delayjabber:x:encryptedjabber:x:oobjabber:x:roster這些名字空間在下面的Jabber 名字空間中被更完整地描述。下面是一個使用jabber:x:delay 名字空間在加入的群組聊天室的顯示上下文的例子:Thrice the

11、 brinded cath mewd.Cached In GC History4. 元素元素提供關于一個Jabber 實體的可用性信息。任何一個通過一個Jabber ID 確認的實體可以與另一個實體進行狀態(tài)信息的通信,這種通信大多以訂閱狀態(tài)信息的方式進行。所有實體的狀態(tài)不是“可用”就是“不可用”?!翱捎谩睜顟B(tài)表示發(fā)送者可以立即收到消息?!安豢捎谩睜顟B(tài)表示發(fā)送者不能在當前時間收到任何數據。默認情況下,所有元素除非包含type=”unavailable”屬性外,都表示“可用”?!翱捎谩钡奶厥庑蝿萃ㄟ^和素進行指定。4.1. “type”屬性的“type”屬性根據不同目的使用。除了提示其它用戶本用戶的

12、可用性狀態(tài)的“普通”用法外,還包括訂閱、取消訂閱、以及探測 “type”屬性的可用值:狀態(tài)信息。下面是4.1.1. type=”available”如果沒有包含任何“type”屬性,狀態(tài)被設為type=”available”,用來提供用戶時的信息。一個type=”available”的狀態(tài)包通常包含一個元素以詳細說明Jabber 實體的可用類型,以及一個元素,該元素包含人能看懂的關于該可用類型的描述。素,來指明該連接的Jabber ID 的優(yōu)先級。狀態(tài)包還可以包含一個元例子:awayStay but a little,I will come again.元素的可用值為:awayJabber 用

13、戶或實體,但不能馬上聯(lián)系上chatJabber 用戶或實體并有聊天dndJabber 用戶或實體disturb”),但不想被打擾(“dnd”表示“do notxaJabber 用戶或實體“extended away”),但已經離開很長時間了(“xa”表示可以包含任意特性數據,這些數據通常包含對于用戶狀態(tài)的描述,如, “開會中”是“away”的一個表現(xiàn)值,或者“忙于編碼”可以是“dnd”的一個表現(xiàn)。4.1.2. type=”error”當一個狀態(tài)包發(fā)送給一個不存在的JID 時,或在發(fā)送狀態(tài)請求時發(fā)生一個錯誤時,服務器都將返回一個type=”error”的狀態(tài)包。下面是一個例子(注意的類型):回復

14、的例子:Remote server timeout. Unable tiverpacket.4.1.3. type=”probe”向一個特定實體(實體不能發(fā)送狀態(tài)消息給自己)發(fā)出狀態(tài)信息請求。服務器而非客戶端,進行一個探測請求。實際上,雖然Jabber 客戶端也可以發(fā)送一個探測一個指定Jabber 用戶是否的請求,但通常都是服務器端發(fā)出探測請求。注意,只有在發(fā)起請求的用戶在請求所對應的用戶的花名冊上,并且擁有“from”或“both”訂閱類型時,服務器才會發(fā)出探測請求。在下面的例子中,看到的Romeo 向Jut 發(fā)出一個探測請求,Jut 所在服務器回復一個“狀態(tài)包”(包含jabber:x:de

15、lay 名字空間中指明的上次狀態(tài)更新的時間戳)探測請求的例子:回復探測請求的例子:Stay but a little, I will come again.away4.1.4. type=”subscribe”發(fā)送一個請求,這個請求是接收者在其發(fā)送者。狀態(tài)改變時,自動發(fā)送狀態(tài)信息給例子:4.1.5. type=”subscribed”發(fā)送一個消息,表明發(fā)送者接受了接受者對其再現(xiàn)狀態(tài)訂閱的請求。從現(xiàn)在起,當發(fā)送者的狀態(tài)信息改變時,服務器將會把狀態(tài)給接收者。例子:4.1.6. type=”unavailable”例子:Disconnnected4.1.7. type=”unsubscribe”發(fā)送

16、一個請求,表明接收者停止發(fā)送狀態(tài)信息給發(fā)送者。例子:4.1.8. type=”unsubscribed”這種類型的狀態(tài)包有兩個用途:1. 發(fā)送一個表明發(fā)送者接受接收者關于不訂閱其狀態(tài)信息的請求。服務器將不再發(fā)送發(fā)送者的狀態(tài)信息給接收者。2.一個訂閱請求。服務器將不再發(fā)送發(fā)送者的狀態(tài)信息的用戶。狀態(tài)信息給試圖訂閱其例子:4.2. 其它屬性除了設置“type”屬性,還可以通過下列屬性修改元素:4.2.1. “from”屬性標識狀態(tài)包的發(fā)送者。一般Jabber ID 再“from”屬性中必須寫成userhost/resource 的格式。從XML 的觀點來說,這個屬性是所有元素所必須的,而在實際應用

17、中,都是服務器對該屬性進行添加和修改(防止一些段),因此客戶端開發(fā)者不需要考慮它。例子:4.2.2. “id”屬性為Gabber 或狀態(tài)請求包配置唯一的驗證符。“id”屬性由 Jabber 客戶端或客戶庫(如)生成,客戶端用其為狀態(tài)包的軌跡進行驗證?!癷d”屬性是可選的,并且不能用于系統(tǒng)其它任何地方。例子:4.2.3. “to”屬性標識狀態(tài)包的接收者。一般Jabber ID 在“to”屬性中都是userhost/resource 的格式,userhost 的格式也是可以的,但當接收者時,它將轉化為userhost/resource。在Jabber 的一般用法中,Jabber 客戶端向服務器發(fā)出

18、狀態(tài)包,服務器將這些狀態(tài)包發(fā)送到該用戶花名冊上所有的用戶。當一個Jabber 客戶端發(fā)送的元素中不含“to”屬性時,服務器將將其轉化為在線狀態(tài)包發(fā)送給指定的Jabber 實體。下面的例子將演示這一過程。發(fā)送給服務器的狀態(tài)的例子:Stay but a little, I will come again.away服務器發(fā)給指定用戶的狀態(tài)例子:Stay but a little, I will comeagain.away4.3. 的下面的元素用于協(xié)議。素4.3.1. 在Jabber 中,根據Jabber 知道的設備數或位置數,一個用戶可以建立相同數量的連接。用戶可以給每一個資源賦予一個數字優(yōu)先級(

19、通過對指派給該資源的 Jabber 客戶端進行設置),這個優(yōu)先級與元素的信。素方法進行通當狀態(tài)包發(fā)送到服務器后,服務器有能力決定哪接資源需要指派一個單一的Jabber ID,該資源將收到發(fā)往該Jabber ID 的消息,這是因為數字最高的資源是默認或第一資源。如果最高優(yōu)先級的資源不可用,消息和其它 Jabber 通信將發(fā)送給次高優(yōu)先級的資源(當其它資源都不可用時,一個沒有從默認數到 0 的優(yōu)先級的客戶端,也可以成為第一資源)舉例來說,Ju的帳號可以通過兩個資源:the balcony 和 the chamber 連接她。如果“balcony”資源的優(yōu)先級被設置為“2”,而“chamber”資源

20、的優(yōu)先級被設為“1”,而且兩個資源都可以連接,消息將發(fā)送到/balcony,而不是/chamber。4.3.2. 可選的元素告訴Jabber 客戶端如何顯示一個用戶的狀態(tài)。狀態(tài)改變理是一個典型的的伴隨,包含由的描述信息。如果元素不在元素中,Jabber 接收客戶端將指明該用戶處于“普通”狀態(tài)。下面是四個可選項:4.3.3. s一些元素包含關于用戶狀態(tài)的描述。大多數Jabber 客戶端都包含us/元素的默認設置;另外,它們還允許提供富有個性的描述如“我在吃午飯”或者“中”。4.3.4. 含義chat該客戶可以馬上聯(lián)系上away該客戶,但剛剛離開(如吃午飯,開會)xa該客戶,但已經處于非活動狀態(tài)很

21、長時間了。dnd該用戶處于謝絕打擾的模式元素作為一個擴展機制來使用,或發(fā)送從服務器發(fā)送命令給客戶端,或從一個客戶端發(fā)送命令到另一個客戶端。每次用到這個元素時,必須指明相關的XML 名字空間。單一消息可以包含多個素實例。下列已定義的名字空間可以使用:/素jabber:x:autoupdatejabber:x:delayjabber:x:encryptedjabber:x:oobjabber:x:roster這些名字空間在下面的Jabber 名字空間中被更完整地描述。5. 元素信息/查詢(IQ)在Jabber 中在兩個實體間構建一個根本的會話,并且允許實體間來回傳送XML 格式的請求和響應。信息/

22、查詢主要的用處是取得或設置公共的用戶信息,比如名字,電子郵件,地址等等。但它的靈活設計使得任何種類的會話都可以發(fā)生。任何通過一個Jabber ID 標識的實體都能通過一個 IQ 與其它實體進行會話。5.1. “type”屬性元素的“type”屬性用于決定信息/查詢是請求還是響應。下面是“type”屬性的可用值:5.1.1. type=”error”表示查詢失敗。實際錯誤在元素的素中描述。例子:Forbidden5.1.2. type=”get”找回指派給一個查詢名字空間的信息。如果沒有設置屬性,默認情況,這個屬性包含在查詢中。一個type=”get”的元素由一個素,這個素通常是素必須左,但也可

23、以是或另一個已有的素。不過,指定的空,以便接收一個用戶所需提供的信息的空間的。一個成功的 get 查詢的結果type=”result”的元素,是元素嵌套在包含了所需信息的指定或)。素(如例子:5.1.3. type=”result”表示包是一個type=”get”或type=”set”的查詢的成功響應。這個成功查詢的結果是一個type=”result”的元素,該元素嵌套在一個包含所查詢的信息的素中(如、)。一個成功的查詢或獲取查詢結果的返回是一個空的type=”result”的元素。一個不成功的返回是一個type=”error”的元素。通常與“id”屬性的獲取、設定查詢有關。例子:vCard

24、data goes here5.1.4. type=”set”表示包是對設值或更改現(xiàn)有數據值。一個type=”set”的元素總是包含一個指定的素,通常是,也可以是或者其它可以接受的素。一個設置命令查詢的成功返回是一個空的type=”result”的元素。例子:vCard data goes here5.2. 其它屬性除了“type”屬性外,IQ 元素還可以通過下面的屬性進行修改。5.2.1. “from”屬性表示 iq 包的發(fā)送者。從 XML 觀點來說,這個屬性是所有元素所必須的,實際應用中這個屬性是服務器來增加和修改的(為防止某些不需要過多關注這個屬性。),因此客戶端的開發(fā)例子:5.2.2.

25、 “id”屬性一個 iq有唯一的標識。Jabber 客戶端或客戶庫生成“id”屬性,客戶端通過它來標識包,以完成對包的(如:一個type=”result”對應一個type=”get”或type=”set”)。“id”屬性是可選的,并且不能用于系統(tǒng)的其它地方。例子:5.2.3 “to”屬性表示 iq 包的接收者。在Jabber 客戶端,對應“to”屬性的Jabber ID 的格式為userhost/resource。userhost 也是可以的,如果用戶,userhost 將被置換成userhost/resource,如果用戶不,userhost 將被直接指向一個離線模塊(對于類似服務器端網關這

26、種非用戶實體,情況又有所不同,因為它們不擁有資源,并且只是簡單通過Jabber ID 的一個“server”端口進行標識。Jud.jabber.Jabber 用戶目錄就是這樣一個例子)。如果包沒有屬性,服務器將對該包進行處理。例子:5.3 的下面介紹元素的素素。5.3.1. 當 iq 的屬性類型被設置為“error”時,將用到本屬性。錯誤代碼根據一個含有錯誤數的“type”屬性進行定義,員司包含該錯誤的文本描述。比如,下面就是一個壞請求:Bad Request在附錄中,列有錯誤編碼及其對應的錯誤描述。5.3.2. 元素為客戶端服務器之間交互提供一層安全保護。它被用戶 jabber:iq:reg

27、ister 和jabber:iq:search 名字空間中。當一個客戶端發(fā)起一個與服務其之間的交互時,服務器將發(fā)送一個包含一個唯一值的給客戶端。客戶端在返回的消息中,包含上訴唯一值到素中。這樣,服務器就認為該客戶端時接收到原來的同一實體。5.3.3. 元素中的素定義所執(zhí)行的查詢的類型。特殊情況下,查詢可以擁有一個特殊的名字空間,這個名字空間是一個通過“xmlns”屬性定義的子元素。一個元素中只能有一個素。下面的例子是當我通過出現(xiàn)的XML。Linux 機器上的Grabber 客戶端登陸到服務器上,將stpeterGabberf1e881517e9917bb815fed112d81d32b4e4b

28、3aed就象你看到的那樣,認證查詢通過客戶端認證名字空間(jabber:iq:auth)向服務器發(fā)送認證信息。一般,Jabber協(xié)議保留jabber:iq:*這樣的名字空間。而開發(fā)者可以通過增加jabber:iq:*名字空間對Jabber字空間中進行更完整的描述。進行擴展。這些將在下面的名一個空素可以與元素一起發(fā)送,這樣可以找回與素中指定的名字空間相關的一個Jabber 實體的信息。比如,找回一個客戶端的花名冊(“聯(lián)系人”),下面的 XML 可以被發(fā)送:6. 名字空間現(xiàn)面是Jabber 中的標準名字空間:jabber:iq:agent工具jabber:iq:agents有效的組jabber:i

29、q:auth簡單用戶認證jabber:iq:autoupdate版本更新申請jabber:iq:browseJabber 瀏覽jabber:iq:conference一般會議jabber:iq:gateway用戶地址網關jabber:iq:last上次使用時間jabber:iq:oob綁定數據輸出jabber:iq:private私有數據jabber:iq:register請求jabber:iq:roster花名冊(聯(lián)系人)管理jabber:iq:search用戶數據庫查詢jabber:iq:time客戶端時間jabber:iq:ver客戶端版本jabber:x:autoupdate版本通知申

30、請jabber:x:conference會議邀請jabber:x:delay顯示的對象jabber:x:encrypted加密的消息jabber:x:envelope消息封套jabber:x:event消息事件jabber:x:expire消息終止jabber:x:oob綁定數據(文件傳輸)輸出jabber:x:roster的花名冊條目jabber:x:signed標記的狀態(tài)vcard-temp臨時的 vCard下面將詳細介紹這些名字空間的細節(jié)。6.1. jabber:iq:agent工具工具名字空間包含一個的所有工具。jabber:iq:angents 查詢通常用于到一個指定的服務、傳輸器。

31、它也可能檢驗一個指定是否可以進行。的所有工具細節(jié)。比如,一個客戶端可以決定一個開放的例子:AIM TransportThis is the AIM TransportAIM/AOL ScreenNameaim6.2. jabber:iq:angents可用的列表可用列表名字空間包含一組實體,這些實體擁有一些特殊工具,并能夠為另一個實體提供服務。大多數情況下,可用表。列表是用來顯示一臺服務器上的可用傳輸器列注意:這個名字空間被jabber:iq:browse 的支持者所(?)。例子:User DirectoryYou may register and create a public search

32、ableprofile, and search for other registered Jabberusers.judAIM TransportThis is the AIM TransportAIM/AOL ScreenNameaim6.3. jabber:iq:auth簡單客戶端認證簡單客戶認證名字空間是對客戶端進行認證的一個簡單機制,它為客戶端到服務器之間的連接創(chuàng)建一個資源。認證成功返回一個type=”result”的IQ 響應。不成功,就返回一個錯誤 IQ 元素。如果沒有發(fā)送名字空間或,如果服務器允許,服務器將創(chuàng)建一個資源。例子:jutsecretbalconyjuta5e052c4

33、8c455bf21d937ccf17225916d9486b09balconyjutsecretbalcony6.4. jabber:iq:autoupdate版本更新申請版本更新申請名字空間允許客戶端對所有可用更新進行申請請求。例子:6.5. jabber:iq:browseJabber 瀏覽Jabber 瀏覽名字空間的作用是,一是為Jabber 世界中已有的Jabber IDs 增加結構的一個途徑,一是發(fā)現(xiàn)為不同Jabber 實體提供的服務或應用。一個Jabber 瀏覽的基本概念就是一個jid-type(類似文件的一個模擬類型的概念)。下面是想象中的最高級別的jid-types,不過隨著時

34、間的推移,一些其它的邏輯將被增加進來:應用會議標題關鍵字回報服務用戶上面每一個范疇都有一個子類列表,如用戶/客戶端,或用戶/設備(“客戶端”或 “設備”只是一個“資源”的概念),會議/irc,服務/icq,標題/庫存。一般的,通過使用jabber:iq:browse 名字空間你將擁有一個與上述某一jid-type 范疇相對應的元素,這個元素通常有一個指定子類型的“type”屬性。Jabber:iq:browse 的一個用戶就是代替jabber:iq:agents 名字空間來列出一個服務器上所對應的或其它服務。下面是一個瀏覽服務器的例子:Jabber 客戶端發(fā)送:Jabber 服務器返回:jab

35、ber:iq:registerjabber:iq:searchjabber:iq:registerjabber:iq:search在會議中的一個例子:6.6. jabber:iq:conference一般會議一般會議名字空間提供一個會議室的機制(如群組聊天室),并提供該會議室的入口。這個名字空間與元素配套使用來獲得一個會議室的信息,包括要求加入這個會議室的請求信息,以及為這個會議室設置信息(通常是為了加入這個房間)。一個普通進入房間的請求將和下面的類似:1. 想要加入的房間提交一個type=”get”的請求。這個XML 將是下面的形式:2. 接受來自要加入的房間的type=”result”的i

36、q 響應,其中有進入房間所需要的參數。這個XML 將是下面的形式:Room Name這里所有的請求元素的素都是可選的。昵稱(nickname)元素表示進入房間需要一個昵稱。密鑰(secret)元素表示進入房間的用戶需要提供一個。獨處(privacy)元素表示如果用戶在一個type=”set”(下面可以看到例子)的iq 包中提供這樣的元素,會議服務器將隱藏用戶的真實Jabbere ID。名字(name)元素是房間的名字(用jabber:iq:browse 瀏覽房間時可以看到同樣的房間名)。3. 發(fā)送當前狀態(tài)給要加入的房間。XML 如下:4. 想要加入的房間提交一個type=”set”的 iq 包

37、以及進入所需信息。XML 如下:mynickmysecondnickthesecret注意在用戶第一個選擇被接受時,用戶可以提交多個昵稱。如果用戶沒有提供昵稱,服務器將指派一個昵稱給用戶。5. 收到你加入的房間,這個 iq 以下面的格式返回:roomserver/uniqueidnumbermynick這個唯一的 ID 號是用戶Jabber ID 的一個哈希。6.7. jabber:iq:gateway用戶地址網關一般通過一個網關或傳輸器(比如AIM 傳輸器)來實現(xiàn)與非Jabber 網絡用戶的通信,每一個非Jabber 網絡都可能擁有唯一的用戶地址,這個地址可能和 Jabber IDs并不。用

38、戶地址網關就是解決這個問題的,它使得 Jabber 客戶端向非Jabber 網絡用戶發(fā)出訂閱時給出正確Jabber IDs 變得很容易。這些通過對用戶進行提示和會 話,引導用戶提供創(chuàng)建一個正確Jabber ID 所需信息來實現(xiàn)。下面將演示這種普通的交互:1. 客戶端向網關發(fā)出帶有jabber:iq:gate 名字空間查詢的iq get:2.服務器返回一個包含請求批準及其描述文本的iq:Please enter the AOL Screen Name oftheyou would like to contact.Screen Name3.客戶端向網關發(fā)送一個包含指定信息的iq set:Joe C

39、ool4.服務器返回一個包含正確Jabber ID 的iq result HYPERLINK mailto:JoeCoolaim.jabber JoeCo HYPERLINK mailto:JoeCoolaim.jabber olaim.jabber.6.8. jabber:iq:last最后一次時間最后一次時間名字空間提供一個標準的方法,通過這個方法可以查詢一個Jabber 實體一個或多個服務更新時間,或者一個客戶最后一次連接(或活動)到一臺服務器上的時間。每一次返回的值都是一個秒的數目。進行查詢的實體可以通過下面的法則解釋獲取的信息:userserver/resource用戶最后一次活動的

40、時間userserver用戶最后一次連接的時間server服務器最后一次啟動的時間例子(服務器):例子(客戶端):Disconnected6.9. jabber:iq:oob綁定數據輸出綁定數據輸出名字空間為客戶端客戶端的文件傳輸提供一個標準方法,通過服務器的傳輸/的傳輸器實現(xiàn)一個特殊的名字空間:例子:/act4/letter-1.htmlTheres a letter for you sir.6.10. jabber:iq:private私有數據私有數據名字空間是Jabber 服務器上私有數據的一個機制。的數據可以是任何合法的 XML 數據。在服務端存放客戶端的當前狀態(tài)信息是這個名字空間的典

41、型用法。例子 1(客戶端私有數據):Hamlet例子 2(客戶端找回私有數據):另外,對于私有數據,1.4 版服務器支持服務器上所有有效名字空間(以“jabber”開頭的名字空間保留,為Jabber 系統(tǒng)進行調用)的 XML 數據。這個數據存在向服務器端發(fā)送type=”set”的 iq 包的用戶的花名冊中。例子 1(客戶端保存公有數據):iblueBach例子 2(客戶端找回公有數據):6.11. jabber:iq:register請求請求名字空間對一個或多個服務進行。它也被用來更新或刪除一個。例子:Some instructions to be displayedwhen theuser

42、is filling out the form.6.12. jabber:iq:roster聯(lián)系人管理聯(lián)系人管理名字空間是客戶端用來管理他們的花名冊的,該花名冊保存在服務器上,這樣用戶可以在任何地方得到它。花名冊是該帳號上所有訂閱信息令列表,包括用戶昵稱和聯(lián)系列表。當用戶從任何一個資源登陸上來,服務器將把花名冊發(fā)送給用戶?;麅允且粋€條目的列表。每一個條目元素都有描述它的屬性。每一個條目元素都包含它所屬組的組元素。下面是描述元素的屬性:“jid”是條目的Jabber ID“subscription”所有和本條目相關的訂閱所對應的用戶的當前狀態(tài)。它可以是“none”(不可訂閱),“to”(有一個

43、發(fā)到該條目的訂閱),“from”(從該條目發(fā)送一個訂閱給),“both”(to、from),或者“remove”(從花名冊上刪除一個條目)?!癮sk”是對這個條目的一個請求的當前狀態(tài)。Subscribe 表示請求對該條目進行訂閱,它的值就是,Unsubscribe 表示取消訂閱?!皀ame”表示昵稱通過使用一個,一個Jabber 客戶端可以控制用戶的JabberID,名稱屬性,群組元素,并且可以在聯(lián)系人上創(chuàng)建或刪除聯(lián)系人。服務器根據客戶端對當前狀態(tài)訂閱請求的響應來管理其它所有屬性。訂閱請求的例子:friends當一個花名冊條目在服務器上改變時,服務器將把這個改變推送給一個用戶。這個推送是一個普

44、通的從服務器發(fā)送到客戶端的包。下面是一個例子:在上面的例子中,服務器推送給客戶端一個花名冊,表明該用戶對 HYPERLINK mailto:romeo romeo 的當前狀態(tài)信息有訂閱。一個花名冊推送可能發(fā)生接的任何時間中,該連接是另接修改資源或服務器(修改訂閱屬性)的結果??蛻舳酥挥惺褂没麅酝扑蛠砀淖兓麅缘娘@示。但不是每次花名冊推送都對用戶起作用。6.13. jabber:iq:search用戶數據庫查詢任何一個器查詢ICQ 用戶。都可以成為一個查詢。例如,JUD 查詢Jabber 用戶,ICQ 傳輸用戶發(fā)送一個進行可查詢域的 Get 請求:查詢返回一個可查域:Fill in a fie

45、ld to search for anymatching Jabber User067941fd96a6a2752a21abcb6d737130dd51dd50注意這些域是以提示的形式返回。為了傳輸的安全還包含一個密鑰(下面會看到)。用戶現(xiàn)在可以在允許的域內進行標準的查詢了。用戶發(fā)回一個 Set 請求給行實際查詢:進Capulet11b830e604215c3a2a24652c69fd4efa2a7a5746服務器根據查詢返回結果:Jut CapuletJutCapuletjuliCSson CapuletSsonCapuletsammy注意有兩套items 標記含有指定信息。這是因為通過發(fā)送

46、返回有兩種方法:單一返回多個“pushed”到用戶的錄。,類似花名冊推送,如在一個時間上的一個記發(fā)送的返回的樣式是查詢的一個工具。比如:juliCJutCapulet多個查詢結果通過服務器進行推送。當所有數據發(fā)送完畢,服務器將發(fā)送下面的返回結果:客戶端接收到多個“sets”,每一個都被,最后收到一個表示“數據結尾”的“返回”。在每一個中,JID 屬性都被強制帶上。例子:6.14. jabber:iq:time客戶端時間客戶端時間名字空間是客戶端改變當前時間的一個標準方法。例子:20010214T18:55:062/15/00 4:55:06 PM6.15. jabber:iq:ver客戶端版本

47、客戶端版本名字空間是得到另一個用戶的客戶端的版本信息的一個標準方法。例子:Gabber0.8.1 (ered by: jabberoo 1.0.0Linux 2.2.16-22 i6866.16. jabber:x:autoupdate應用程序版本通知版本更改申請名字空間使服務器可以在一個應用的新版本可用時通知客戶端。例子:A new verof WinJabis available, see6.17. jabber:x:conference會議邀請會議邀請名字空間使用戶可以邀請其它Jabber 用戶到指定會議室。相關聯(lián)信息該會議室的Jabber ID,內嵌在一個消息的元素中。例子:Where

48、fore art thou Romeo?6.18. jabber:x:delay標記對象延時標記對象延時名字空間是消息和當前狀態(tài)信息的時間戳信息,其中,當一個 Jabber實體不時,當前狀態(tài)信息可以保存并在稍后發(fā)送。當實體上線時,包含的信息標記對象延時名字空間使Jabber 客戶端顯示出該包體最早產生的時間,而不是它發(fā)送給Jabber 實體的時間。例子:Thrice the brinded cath mewd.Cached In GC History6.19. jabber:x:encrypted加密消息加密消字空間用來支持使用公共密鑰(一般通過客戶端使用PGP 或GPG,服務端用同樣的名字空

49、間進行加密來實現(xiàn))加密的消息交互。一個相關的名字空間,jabber:x:signed,用來進行當前狀態(tài)信息的加密。例子:/balconyThis Message is EncryptedhQEOA7ucqu53AhlPEAP/ZbU6oPnRAbIcUxMK1XRVnkgZ/Agtq1tcTQuEZxbpZLl4C/4psQGLgBU5h5Y3/khxtJTPXKn1izyc+DRZ8hqn2p4mwC8ioKTBJ6P6dfEpQEyta4bimM5fqdeh4gRkMhwThRSJxBCJBVVWFEViu+0KlHHB5AeeL4qwRGb2dhGjIgQD/R9x0D0qtgBGwuN

50、DEYKZSs4LEoTPL8CVsAWOzS2QgS0GBqttFDKId6XaNu36dB2D8VHdxQnI8RtHo9pfTYDaXWB3dMGTt896iEO/sTuucYObf3sK5Kygg0uWpBpvQPjuFLQxCI6ch4ybauXfOKNOGDQwmsn6OaeVFUwdsedI3c6VdQtodnWVkR5BOjnn0VqnhrVTu7cp6VXrrRK4g9atPEe6C4R/MilBjzIJBcET0jhWuAyiBo3gN/6IqYRZNSXL9ZqGPJwNTlYim1EHN3qBqiUwzUMamEoRzcusn80Z7kylve5ujIeSD/pVwoa

51、wHHvLp92kO2hd0yGD0UrWSfKU1o6yEY8yhZ5P1v02pIKigAUI2c6xt/KhSxQ=fijN6.20. jabber:x:envelope消息信封消息信封名字空間是表明消息有是一些所支持的名字空間:的尋址方式,如聯(lián)合進行的尋址。下面toccreplytofromforwardedby上述每一個元素都帶有一個”jid”屬性來標識Jabber 實體是發(fā)送、中轉、還是收到消息。例子:And there I am. Where is my Romeo?RomeoGod6.21. jabber:x:event消息事件消息時間名字空間是標識一條消息的狀態(tài)的一個機制?,F(xiàn)

52、在,事件與一條消息如下般相關聯(lián):個用戶正在對消息進行回復發(fā)送給指定接收者的消息顯示給指定接收者的消息為離線進行的消息對于客戶端來說,這些消息事件的支持是可選的,而且,只有在另一用戶在聊天中發(fā)出請求,這些消息事件才會被發(fā)送。不同的Jabber 客戶端將對當前狀態(tài)消息事件進行不同的顯示。對消息通知的請求的例子:By whose direction foundst thou out this place?發(fā)送消息通知的例子:By whose direction foundst thou out this place?1001可以同時請求多個消息事件。6.22. jabber:x:expire消息到期

53、消息到期名字空間是說明一條消息擁有一個有限的存活事件的一個簡單擴展。如果消息被離線,而到了到期時間,服務器將不再發(fā)送該消息。如果一條消息為預覽就進行發(fā)送,Jabber 客戶端可以選擇不顯示該消息?!皊econdes”屬性定義消息發(fā)送的事件。例子:Theres a letter for you sir6.23. jabber:x:oob綁定數據輸出綁定數據輸出名字空間使用戶可以通過交換一個標準的URL 來實現(xiàn)文件傳輸的目電。使用jabber:x:oob 的URLs 交換可以包含任一消息(在一個素內),感覺就像里的附件一樣。多個附件可以包含在同一個消息中。例子:URL Attached./act4

54、/letter-1.htmlTheres a letter for you sir6.24. jabber:x:roster內置的花名冊條目內置的花名冊條目使用戶可以在一個消息中包含花名冊條目,這樣很容易在用戶之間發(fā)送。每一個花名冊條目都包含在一個的一個素中。這個元素一般用在一個元素中,但這不是必須的。例子:Here are some new Jabber usersto add to your contact list!RoyaltyFriends6.25. jabber:x:signed有符號的當前狀態(tài)有符號的當前狀態(tài)名字空間用來支持交換使用公共密鑰(客戶端使用 PGP 或GPG,服務端使

55、用同樣的名字空間進行加密)加密的當前狀態(tài)信息。一個相關的名字空間, jabber:x:encrypted 用來支持加密消息。例子:/balconyawaybe back lateriD8DBQA6kasv0 xpc2/POfPkRAnz0AJ9UEYYWWSReddIKk3AYMfTFtDJwCfbcLdJcSUOR0FlS+rDFjMgSM+iNaNm6.26. vcard-temp臨時 vCardvCard 格式是一個“電子商務卡的標準格式,通過使用通過互聯(lián)網進行個人數據的直接交換,如同在非互聯(lián)網下的環(huán)境一樣”。由于XML 的vCard 的格式還沒有標準化,Jabber.項目在XML 的v

56、Card 標準建立之前,暫時設置了這樣一個臨時名字文件。由于這幾年在vCard 的XML 的標準的指定上沒有任何進步,Jabber.開發(fā)者專門為這個項目創(chuàng)建了一個項目吸引Jabber 社區(qū)外其它開發(fā)者的注意。因此,最后的XML的vCard 格式的最后 DTD 可能會在下面的URL 中找到:例子 1(對vCard 的客戶端請求):例子 2(客戶端收到vCard 數據):vCard data goes here例子 3(客戶端向服務端發(fā)送vCard):vCard data goes here7. 使用用例這一部分提供一些在Jabber 協(xié)議上略有不同的觀點,通過用例來闡述。下面每一個例子都展示一個

57、Jabber 用戶完成一個完整的任務的消息流程,該流程包括接收和發(fā)送,如到一臺服務器,登陸,改變當前狀態(tài),或者發(fā)送一條消息。如果時間允許,我將把這部分引申的更遠。7.1. Jabber 用戶本用例同時邪顯示Jabber 用戶向服務器開啟一個socket 的連接,以及服務器的響應(如:)。1. Jabber 用戶通過開啟一個從客戶端到服務器端的XML 流,來申請一個在服務器上的socket 連接。SEND: 2. 服務器通過開啟一個從服務器到客戶端的XML 流進行回復。RECV: 3. Jabber 用戶提供一個需要一個帳號(理論上,這需要一個不同的順序:首先詢問服務器需要什么信息,然后服務器器

58、告知客戶端需要什么樣的信息;但在實際中,假定需要的信息是:用戶名,資源,)的信息。SEND:Jutbalcony4. 服務器響應一個空的類型為”result”的 iq 元素,表示已成功。RECV:Jabber 用戶登陸Jabber 用戶詢問服務器,登陸所需要提供的信息。SEND:Jut2. 服務器提示Jabber 用戶登陸所需要的信息。RECV:Jut5003B905BFDJabber 用戶提供所需的信息在本例中,是一個元素,它是對3.信息進行一個零度知識認證的一個哈希。(見)。SEND:Jutbalcony77d7eacde5e56b9622d0a075cb88361b110fb9d74.服

59、務器響應一個空的類型為”result”的 iq 元素,表明登陸成功。RECV:5. Jabber 用戶發(fā)送當前狀態(tài)給服務器,表明其。SEND:Online7.3. Jabber 用戶增加一個聯(lián)系人1.Jabber 客戶端在花名冊上增加一個聯(lián)系人(只是預備的操作)。SEND:2.Jabber 用戶發(fā)送一個對該聯(lián)系人的訂閱請求。SEND:Wherefore are thou?3.服務器發(fā)送一個花(早已有了該訂閱)。推送給用戶一個新條目和一個類型為”none”的訂閱RECV:服務器發(fā)送一個類型為”result”的 iq 包,表示花名冊推送成功(讓人有點疑惑的是,這個包是從Jabber 用戶發(fā)送到Ja

60、bber 用戶的!)4.RECV:服務器發(fā)送另一個花的狀態(tài)未定。推送,這次是ask=subscribe屬性,表示訂閱5.RECV:Romeo 對訂閱請求的下一個響應會是什么呢?現(xiàn)在接受訂閱請求為“結束”的。假定訂閱以Romeo6.RECV:7.服務器再次發(fā)送一個花推送給客戶端,這次subscription=to,表示訂閱請求被接受了(Jut 現(xiàn)在可以訂閱到Romeo 的當前狀態(tài)了)。RECV:7.4. Jabber 用戶獲得花名冊SEND:RECV:/balcony7.5. Jabber 用戶發(fā)送一條消息SEND:Wherefore are thou?注意:服務器會根據Jabber 用戶的會話

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論