Smack Message擴展,添加自定義元素(標籤)經驗分享

     Smack框架對XMPP協議進行了封裝,從而方便與Openfire即時通訊服務器作交互。說白了,Smack框架能夠經過對象構造符合XMPP協議的XML字符串,避免手動拼接字符串。數據庫

 

XMPP協議基本XML結構以下:服務器

 

1 <message
2     from='發送方jid'
3     to='接收方jid'
4     type='消息類型(普通消息/羣聊)'>
5   <body>消息內容</body>
6 </message>

     

     大多數狀況下,這麼簡單的結構是知足不了需求的,咱們可能會嘗試向message元素下增長子元素,用來描述更多信息。app

     好比,除了發送方的jid,咱們想直接帶上發送方的暱稱和頭像URL,這樣能夠避免反覆從數據庫中查詢這些基本信息。但這個看似簡單的過程,在Smack中實現的卻至關隱晦,接下來直接經過代碼說明。框架

 

發送消息基本流程ide

 

 1 //build chat
 2 Chat chat = chatManager.createChat("對方jid");
 3 
 4 //build extension
 5 UserInfo4XMPP userInfo4XMPP = new UserInfo4XMPP();
 6 userInfo4XMPP.setNameText("菜鳥");
 7 userInfo4XMPP.setUrlText("http://www.liaoku.org/");
 8 
 9 //build message
10 Message message = new Message();
11 message.setBody("hello 你好");  //消息內容
12 message.addExtension(userInfo4XMPP);  //添加擴展內容
13 
14 //send
15 chat.sendMessage(message);

 

UserInfo4XMPP 定義ui

 

 1 import org.jivesoftware.smack.packet.ExtensionElement;
 2 
 3 /**
 4  * 爲Message擴展用戶信息
 5  * @author 楊元(轉載不註明出處可恥,原文請搜索[楊元博客])
 6  * @version 建立時間:2015年5月11日 下午4:55:38
 7  */
 8 public class UserInfo4XMPP implements ExtensionElement{
 9     
10     //用戶信息元素名稱
11     private String elementName = "userinfo";
12     //用戶暱稱元素名稱
13     private String nameElement = "name";
14     //用戶頭像地址元素名稱
15     private String urlElement = "url";
16     //用戶暱稱元素文本(對外開放)
17     private String nameText = "";
18     //用戶頭像地址元素文本(對外開放)
19     private String urlText = "";
20     
21     @Override
22     public String getElementName() {
23         return elementName;
24     }
25     
26     /**
27      * 返回擴展的xml字符串
28      * 此字符串做爲message元素的子元素
29      */
30     @Override
31     public CharSequence toXML() {
32         StringBuilder sb = new StringBuilder();
33         
34         sb.append("<");
35         sb.append(elementName);
36         sb.append(">");
37         
38             sb.append("<");
39             sb.append(nameElement);
40             sb.append(">");
41             sb.append(nameText);
42             sb.append("</");
43             sb.append(nameElement);
44             sb.append(">");
45             
46             sb.append("<");
47             sb.append(urlElement);
48             sb.append(">");
49             sb.append(urlText);
50             sb.append("</");
51             sb.append(urlElement);
52             sb.append(">");
53         
54         sb.append("</");
55         sb.append(elementName);
56         sb.append(">");
57         
58         return sb.toString();
59     }
60 
61     /**
62      * 可忽略
63      */
64     @Override
65     public String getNamespace() {
66         return "";
67     }
68     
69     public String getNameText() {
70         return nameText;
71     }
72 
73     public void setNameText(String nameText) {
74         this.nameText = nameText;
75     }
76 
77     public String getUrlText() {
78         return urlText;
79     }
80 
81     public void setUrlText(String urlText) {
82         this.urlText = urlText;
83     }
84 }

 

     簡單說明下,關鍵是實現ExtensionElement接口,而後實現本身的toXML方法,將要擴展的XML字符串返回便可,此字符串將做爲message元素的子元素。this

 

生成的message xml 結構url

 

1 <message id='76Ws9-11'>
2     <body>hello 你好</body>
3     <userinfo>
4         <name>菜鳥</name>
5         <url>http://www.liaoku.org/</url>
6     </userinfo>
7 </message>

 

     基本流程就是這樣了,但願對讀者有所幫助。spa

相關文章
相關標籤/搜索