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