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库升级应用的问题了。
---感谢关注,再会!												
											XMPP技术之Smack库的自定义消息扩展的更多相关文章
- 【小结】有关mysql扩展库和mysqli扩展库的crud操作封装
		现阶段php如果要操作mysql数据库 php给我们提供了3套库 1.mysql扩展库 面向过程操作 2.mysqli扩展库 面向对象操作和面向过程操作并存 安全性和效率高于mysql扩展库 ... 
- Xmpp学习之Smack发送消息JID变乱码
		Xmpp学习之Smack发送消息JID变乱码 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6947723 ... 
- 【Linux技术】linux库文件编写·入门
		一.为什么要使用库文件 我们在实际编程中肯定会遇到这种情况:有几个项目里有一些函数模块的功能相同,实现代码也相同,也是我们所说的重复代码.比如,很多项目里都有一个用户验证的功能. 代码段如下: //U ... 
- xmppmini 项目详解:一步一步从原理跟我学实用 xmpp 技术开发 2.登录的实现
		第二章登录的实现 金庸<倚天屠龙记> 张三丰缓缓摇头,说道:“少林派累积千年,方得达成这等绝技,决非一蹴而至,就算是绝顶聪明之人,也无法自创.”他顿了一顿,又道:“我当年在少林寺中住过,只 ... 
- 15个JavaScript本地存储技术的函数库和工具
		当构建更复杂的JavaScript应用程序运行在用户的浏览器是非常有用的,它可以在浏览器中存储信息,这样的信息可以被共享在不同的页面,浏览会话. 在最近的过去,这将有可能只被cookies文本文件保存 ... 
- 性能:15个JavaScript本地存储技术的函数库和工具
		当构建更复杂的JavaScript应用程序运行在用户的浏览器是非常有用的,它可以在浏览器中存储信息,这样的信息可以被共享在不同的页面,浏览会话. 在最近的过去,这将有可能只被cookies文本文件保存 ... 
- Smack IQ包的扩展
		前几天一直很烦躁,怎么扩展smack的IQ包堵了我好久,今天静下心来看了下smack的源码,把这个问题解决了.下面给出步骤: 如果我们要扩展一个如下所示的IQ包: <iq id="00 ... 
- Delphi COM编程技术三类型库(库文件中的工具栏,很全)
		在COM组件的使用和开发过程中经常需要获取有关组件的信息.而COM组件以二进制代码的形式发布,如果不借助特定的工具这些相关信息将难以被获取.通过访问类型库就可以查看COM组件的信息. 一.类型库的基础 ... 
- Mockito 库、powermock扩展
		转载:http://blog.csdn.net/kittyboy0001/article/details/18709685 Mockito 简介 Mockito 是目前 java 单测中使用比较流行的 ... 
随机推荐
- MD5加密工具类
			简单的md5加密: package com.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithm ... 
- Failed to start component  [StandardEngine [Catalina].StandardHost[localhost].StandardContext[/项目名]]
			问题: 最近几天在做一个小项目,今天中午本来想启动tomcat打开看看项目的,没想到项目突然无法打开,页面总是显示404 tomcat报错如下:Failed to start component [S ... 
- 通过 ContentResolver 读取联系人信息
			1.首先动态获取 读取联系人信息权限 <1>配置文件中声明对应权限 ) } ] == PackageManager.PERMISSION_GRANTED) { readContact ... 
- BZOJ.2616.SPOJ PERIODNI(笛卡尔树 树形DP)
			BZOJ SPOJ 直观的想法是构建笛卡尔树(每次取最小值位置划分到两边),在树上DP,这样两个儿子的子树是互不影响的. 令\(f[i][j]\)表示第\(i\)个节点,放了\(j\)个车的方案数. ... 
- 新浪云SAE 关于部分函数不能使用的做法
			例如:file_put_contents("test.txt","Hello World. Testing!"); 可以这样写: file_put_conten ... 
- windows 2008下IIS7 安装ASP.NET 遇到500.19
			windows 2008下IIS7 安装ASP.NET 遇到如下错误: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. ... 
- “扩展域”与"边带权"的并查集
			https://www.luogu.org/problemnew/show/P1196 银河英雄传说 #include<bits/stdc++.h> using namespace std ... 
- ECMA Script 6_数值的扩展
			1. 二进制 和 八进制 新的表示法 前缀 0b(或0B) 表示 二进制 前缀 0o(或 0O )表示 八进制 console.log(0b111110111 === 503); // true co ... 
- 2018-2019-1 20189210 《LInux内核原理与分析》第六周作业
			系统调用实验(下): 将第四章的两个实验集成到MenuOS系统中,将其作为MenuOS系统的两个命令,新版本的menu中已经把两个系统调用添加进去了,只需重新克隆一个新版本的menu. 使用make ... 
- Android 小票打印USB
			第一步USB通信: Usb设备有两种,Host与Accessory 简单来说是主模式与从模式,主模式则android设备给外设供电,反之,外设给android设备充电,对于小票打印,使用的是Host模 ... 
