Smack Message扩展,添加自定义元素(标签)经验分享

来源:互联网 发布:android 数据加密 编辑:程序博客网 时间:2024/04/28 22:28

Smack Message扩展,添加自定义元素(标签)经验分享

     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>
复制代码

 

     基本流程就是这样了,希望对读者有所帮助。