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 单测中使用比较流行的 ...
随机推荐
- Crypto支付宝模块的安装
沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info 1.将Crypto放到site-packages下 2.OSErro ...
- Python学习(四十一)—— Djago进阶
一.分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views ...
- Tomcat目录结构详解
1.bin: 该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe.tomcat6w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗口 ...
- 【Vue】-- 数据双向绑定的原理 --Object.defineProperty()
Object.defineProperty()方法被许多现代前端框架(如Vue.js,React.js)用于数据双向绑定的实现,当我们在框架Model层设置data时,框架将会通过Object.def ...
- 第九篇 蓝图 blueprint
在Flask中的蓝图 blueprint 的作用就是将 功能 与 主服务 分开 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_use ...
- mysql的event(事件)用法详解
SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHOW VARIABLES LIKE 'e ...
- __x__(36)0908第五天__背景 background
1. 背景 background: red url(img/cat.gif) repeat-x fixed; 2. 背景颜色 background-color: red; 3. 背景图片 backgr ...
- (78)Wangdao.com第十五天_JavaScript 面向对象
面向对象编程(Object Oriented Programming,缩写为 OOP) 是目前主流的编程范式. 是单个实物的抽象, 是一个容器,封装了属性(property)和方法(method),属 ...
- puppeteer 填充基础表单
main.js const pptr = require("puppeteer"); const gotoUrl = "http://127.0.0.1:5500/ind ...
- 关于finally代码块是否一定被执行的问题
一般来说,只要执行了try语句,finally就会执行 但是,有以下几种情况需要特殊考虑 具体例子看链接 点击这里 第一点 try代码块没有被执行,意思就是错误在try代码块之前就发生了. 第二点 ...