Smack框架对XMPP协议进行了封装,从而方便与Openfire即时通信服务器做交互。说白了,Smack框架可以通过对象构造符合XMPP协议的xml字符串,避免手动拼接字符串。
XMPP协议基本XML结构如下:
1 <message2 from='发送方jid'3 to='接收方jid'4 type='消息类型(普通消息/群聊)'>5 <body>消息内容</body>6 </message>
大多数情况下,这么简单的结构是满足不了需求的,我们可能会尝试向message元素下增加子元素,用来描述更多信息。
比如,除了发送方的jid,我们想直接带上发送方的昵称和头像URL,这样可以避免反复从数据库中查询这些基本信息。但这个看似简单的过程,在Smack中实现的却相当隐晦,接下来直接通过代码说明。
发送消息基本流程
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 message10 Message message = new Message();11 message.setBody("hello 你好"); //消息内容12 message.addExtension(userInfo4XMPP); //添加扩展内容13 14 //send15 chat.sendMessage(message);
UserInfo4XMPP 定义
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 @Override22 public String getElementName() {23 return elementName;24 }25 26 /**27 * 返回扩展的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 }
简单说明下,关键是实现ExtensionElement接口,然后实现自己的toXML方法,将要扩展的XML字符串返回即可,此字符串将作为message元素的子元素。
生成的message xml 结构
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>
基本流程就是这样了,希望对读者有所帮助。
新闻热点
疑难解答