Smack框架對(duì)XMPP協(xié)議進(jìn)行了封裝,從而方便與Openfire即時(shí)通信服務(wù)器做交互。說(shuō)白了,Smack框架可以通過(guò)對(duì)象構(gòu)造符合XMPP協(xié)議的xml字符串,避免手動(dòng)拼接字符串。
XMPP協(xié)議基本XML結(jié)構(gòu)如下:
1 <message2 from='發(fā)送方j(luò)id'3 to='接收方j(luò)id'4 type='消息類型(普通消息/群聊)'>5 <body>消息內(nèi)容</body>6 </message>
大多數(shù)情況下,這么簡(jiǎn)單的結(jié)構(gòu)是滿足不了需求的,我們可能會(huì)嘗試向message元素下增加子元素,用來(lái)描述更多信息。
比如,除了發(fā)送方的jid,我們想直接帶上發(fā)送方的昵稱和頭像URL,這樣可以避免反復(fù)從數(shù)據(jù)庫(kù)中查詢這些基本信息。但這個(gè)看似簡(jiǎn)單的過(guò)程,在Smack中實(shí)現(xiàn)的卻相當(dāng)隱晦,接下來(lái)直接通過(guò)代碼說(shuō)明。
發(fā)送消息基本流程
1 //build chat 2 Chat chat = chatManager.createChat("對(duì)方j(luò)id"); 3 4 //build extension 5 UserInfo4XMPP userInfo4XMPP = new UserInfo4XMPP(); 6 userInfo4XMPP.setNameText("菜鳥"); 7 userInfo4XMPP.setUrlText("http://www.liaoku.org/"); 8 9 //build message10 Message message = new Message();11 message.setBody("hello 你好"); //消息內(nèi)容12 message.addExtension(userInfo4XMPP); //添加擴(kuò)展內(nèi)容13 14 //send15 chat.sendMessage(message);UserInfo4XMPP 定義
1 import org.jivesoftware.smack.packet.ExtensionElement; 2 3 /** 4 * 為Message擴(kuò)展用戶信息 5 * @author 楊元(轉(zhuǎn)載不注明出處可恥,原文請(qǐng)搜索[楊元博客]) 6 * @version 創(chuàng)建時(shí)間: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 //用戶昵稱元素文本(對(duì)外開放)17 private String nameText = "";18 //用戶頭像地址元素文本(對(duì)外開放)19 private String urlText = "";20 21 @Override22 public String getElementName() {23 return elementName;24 }25 26 /**27 * 返回?cái)U(kuò)展的xml字符串28 * 此字符串作為message元素的子元素29 */30 @Override31 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 @Override65 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 }簡(jiǎn)單說(shuō)明下,關(guān)鍵是實(shí)現(xiàn)ExtensionElement接口,然后實(shí)現(xiàn)自己的toXML方法,將要擴(kuò)展的XML字符串返回即可,此字符串將作為message元素的子元素。
生成的message xml 結(jié)構(gòu)
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>
基本流程就是這樣了,希望對(duì)讀者有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注