你的位置:首页 > Java教程

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


     Smack框架对XMPP协议进行了封装,从而方便与Openfire即时通信服务器做交互。说白了,Smack框架可以通过对象构造符合XMPP协议的

 

XMPP协议基本

 

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    * 返回扩展的28    * 此字符串作为message元素的子元素29   */30   @Override31   public CharSequence to32     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接口,然后实现自己的to

 

生成的message

 

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>

 

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