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元素下增加子元素,用来描述更多信息。

     比如,除了发送方的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 message
10 Message message = new Message();
11 message.setBody("hello 你好");  //消息内容
12 message.addExtension(userInfo4XMPP);  //添加扩展内容
13 
14 //send
15 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     @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元素的子元素。

 

生成的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>

 

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

 

posted @ 2015-05-11 23:06  杨元  阅读(5361)  评论(0编辑  收藏  举报