zoukankan      html  css  js  c++  java
  • XMPP技术之Smack库的自定义消息扩展

    写此文是为了纪念我耗时两天的Smack库应用开发。

    太苦恼了,网上找了一堆材料,关于XMPP的消息扩展方面的资料感觉都是出于同一个源头,基本问题还是基于的库版本都是低于4.1版本的讲解。

    我是在Smack4.3版本上做应用开发的,所以即便看到这些资料对Message 和Extension的概念阐述已经颇为详细和易懂了,但是在我的项目中就是无法成功发送和接收到自定义消息扩展。

    当然,我们这里不卖关子,直接指明:根本原因是Smack4.2及以后版本对于扩展消息的XML书写更规范了,以前的写法就不合乎它的要求了。故而,发送端发不出扩展消息XML标签内容、接收端只能收到body消息体。

    多说无益,这里把需要注意的关键代码列出了,希望能帮助到有需要的朋友们!

    我们的扩展消息定义:

    public class MyMessage implements ExtensionElement {

    public static final String NAME = "xxx-demo";
    public static final String NAME_SPACE = "xmpp:xxx:extension";

    private String id = "";
    private Integer status = 0;

    public String getId() {
    return id;
    }

    public void setId(String id) {
    this.id = id;
    }

    public Integer getStatus() {
    return status;
    }

    public void setStatus(Integer status) {
    this.status = status;
    }

    @Override
    public String getElementName() {
    return NAME;
    }

    @Override
    public String getNamespace() {
    return NAME_SPACE;
    }

    @Override
    public CharSequence toXML(String var1) {
    StringBuilder buffer = new StringBuilder();
    buffer.append("<");
    buffer.append(NAME);

    buffer.append(" ");
    buffer.append("xmlns='");
    buffer.append(NAME_SPACE);
    buffer.append("'");

    buffer.append(">");

    buffer.append("<").append("id").append(">").append(id).append("</").append("id").append(">");
    buffer.append("<").append("status").append(">").append(status.toString()).append("</").append("status").append(">");

    buffer.append("</");
    buffer.append(NAME);
    buffer.append(">");

    return buffer;
    }
    }

    我们的扩展消息解码器

    public class MyProvider extends ExtensionElementProvider {
    @Override
    public MyMessage parse(XmlPullParser parser, int initialDepth) throws Exception {
    boolean done = false;
    MyMessage mymsg = new MyMessage();
    while (!done) {
    int eventType = parser.next();
    String name = parser.getName();//XML Tab标签
    if (eventType == XmlPullParser.START_TAG) {
    if (name.equals("id")) {
    mymsg.setId(parser.nextText());
    }
    if (name.equals("status")) {
    mymsg.setStatus(Integer.parseInt(parser.nextText().trim()));
    }
    }
    if (eventType == XmlPullParser.END_TAG) {
    if (MyMessage.NAME.equals(name)) {
    done = true;
    }
    }
    }
    return mymsg;
    }
    }

    最后:
    我这里不是完整XMPP技术的介绍,也不是XMPP自定义消息的讲解,
    只是假定你是XMPP技术应用开发者、以前用过XMPP自定义消息方面的功能、且是Java语言阵营的一员,
    那么,对于这个问题你只需要看看我给出的这部分代码,应该就能搞定Smack库升级应用的问题了。

    ---感谢关注,再会!
  • 相关阅读:
    Selenium Webdriver 自动化测试开发常见问题(C#版)VS
    HTML 和 Body 在 CSS 中的区别
    安装SDK时出现Fetching https://dl-ssl.google.com/android/repository/addons_list-1.xml
    配置好Java和SDK的环境变量后,Javac不是内部命令
    关于adb连接手机offline的问题解决
    CSDN上总结的测试工具排名
    关于性能优化
    关于WAS_1
    IIS服务器搭建
    关于WAS
  • 原文地址:https://www.cnblogs.com/woodzcl/p/10764347.html
Copyright © 2011-2022 走看看