• 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>

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

  • 相关阅读:
    3月1日中国观点股评级:将新浪上调至买入评级
    详讯:新浪第四季度净盈余1亿美元
    陈诉称必应1月全球市场份额首超雅虎
    Facebook收买群组动静办事供应商Beluga
    EMC宣布混杂云战略 年内新开6家中国分公司
    动静称微软最快在3月内推出IE9 RTW版
    Unity3D ShaderLab 混合两张贴图(Blend)
    C# 对排序的认识( Comparison ) ,使用匿名方法实现比较器
    C# 优雅的解决 多线程中访问 UI 的问题
    C# 为SharpDevelop4.1 做了一个深色的配色
  • 原文地址:https://www.cnblogs.com/iyangyuan/p/4496015.html
Copyright © 2020-2023  润新知