基於WPF+XMPP的IM程序開發日志 之三:用戶頭像Avatar


在XMPP中對用戶頭像的支持定義在兩個擴展協議中:

EXP-0153:基於電子名片的頭像

EXP-0084:用戶頭像

好像還有一個擴展協議用於頭像,但忘記了是什么了,ags的官網論壇突然間訪問不了。但EXP-0084好像支持不是很廣泛,agsXMPP支持了,但是Openfire不支持,我在agsXMPP中新建了一個AvatarIq,發送后,得到Openfire的回應IQ錯誤是Service-Unavailable,代碼片段:AvatarIq avatarIq = new AvatarIq();

avatarIq.Type = IqType. get;
avatarIq.To =  " test@mypc ";
avatarIq.From =  " test2@mypc ";
avatarIq.Id =  " avatar_id_001 ";

_xmppConn.Send(avatarIq)

 

 得到的回應IQ為:
<iq xmlns="jabber:client" from="test@mypc" to="test@mypc" type="error" id="avatar_id_001"><query xmlns="jabber:iq:avatar" /><error code="503" type="cancel"><service-unavailable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" /></error></iq>

  而且好像ags的論壇的ALEX也說最好使用EXP-0153的avatar方式。

於是改成使用 :

agsXMPP.protocol.iq.vcard.VcardIq viq = new agsXMPP.protocol.iq.vcard.VcardIq();
viq.To = new Jid("test2@mypc");
viq.From = new Jid("test@mypc");
viq.Id = "id_00010";
viq.Type = IqType.get;

_xmppConn.Send(viq); 

果然返回的就是一個Vcard的IQ。這里根據XEP-0153定義的,Photo中間的BINVAL節就是用戶頭像的base64編碼內容,解碼出來就是用戶頭像,或者Photo.Image本身就是一個System.Drawing.Imaging.Image對象。

另外,由於對XMPP不是很熟練,在使用IQ的時候, 發送了IQ,但卻沒有觸發xmppClientConnection對象的OnIq事件,后來查看RFC3920協議關於IQ的描述部分,發現自己沒有設置ID和type:

 

為了強制執行這些語義學,要應用以下規則:
1. 對於IQ節來說'id'屬性是必需的(REQUIRED).
2. 對於IQ節來說'type'屬性是必需的(REQUIRED). 它的值必須(MUST)是以下之一: 
get -- 這個節是一個對信息或需求的請求.
set -- 這個節提供需要的數據, 設置新的值, 或取代現有的值.
result -- 這個節是一個對一個成功的 get 或 set 請求的應答.
error -- 發生了一個錯誤,關於處理或遞送上次發送的 get 或 set的(參見 節錯誤 Stanza Errors(第九章第三節)).
3. 一個接收到"get" 或 "set" 類型的IQ請求的實體必須(MUST)回復一個"result"或"error"類型的IQ應答(這個應答必須(MUST)保留相關請求的'id'屬性).
4. 一個接收到"result"或"error"類型的IQ節的實體不能(MUST NOT)再發送更多的"result"或"error"類型的IQ應答; 無論如何, 如上所述, 請求實體可以(MAY) 發送另一個請求(如, 一個"set"類型的IQ,通過get/result對提供查詢(discovery)所需的信息).
5. 一個"get" 或 "set" 類型的IQ節必須(MUST)包含並只包含一個子元素指明特定請求或應答的語義.
6. 一個"result"類型的IQ節必須(MUST)包含零或一個子元素.
7. 一個"error"類型的IQ節應該(SHOULD)包含和"get"或"set"相關聯的那個子元素並且必須(MUST)包含一個<error/>子

 看來底層協議的理解還是必不可少的,雖然有類庫的幫助,但是了解根本的東西才是理解類庫的最好保證。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM