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库升级应用的问题了。

    ---感谢关注,再会!
  • 相关阅读:
    你有犯错的权利
    面对人生这道程序,该如何编码?
    如何面对失败?
    知行:成长的迭代之路
    一份软件工程行业生存指南
    知行:程序员如何保持二者的平衡
    花钱的习惯
    互联网金融涌动下的冲动与借债
    docker 常用命令
    java 静态变量 静态代码块 加载顺序问题
  • 原文地址:https://www.cnblogs.com/woodzcl/p/10764347.html
Copyright © 2011-2022 走看看