写此文是为了纪念我耗时两天的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库的自定义消息扩展的更多相关文章

  1. 【小结】有关mysql扩展库和mysqli扩展库的crud操作封装

    现阶段php如果要操作mysql数据库 php给我们提供了3套库 1.mysql扩展库   面向过程操作 2.mysqli扩展库  面向对象操作和面向过程操作并存  安全性和效率高于mysql扩展库 ...

  2. Xmpp学习之Smack发送消息JID变乱码

    Xmpp学习之Smack发送消息JID变乱码 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6947723 ...

  3. 【Linux技术】linux库文件编写·入门

    一.为什么要使用库文件 我们在实际编程中肯定会遇到这种情况:有几个项目里有一些函数模块的功能相同,实现代码也相同,也是我们所说的重复代码.比如,很多项目里都有一个用户验证的功能. 代码段如下: //U ...

  4. xmppmini 项目详解:一步一步从原理跟我学实用 xmpp 技术开发 2.登录的实现

    第二章登录的实现 金庸<倚天屠龙记> 张三丰缓缓摇头,说道:“少林派累积千年,方得达成这等绝技,决非一蹴而至,就算是绝顶聪明之人,也无法自创.”他顿了一顿,又道:“我当年在少林寺中住过,只 ...

  5. 15个JavaScript本地存储技术的函数库和工具

    当构建更复杂的JavaScript应用程序运行在用户的浏览器是非常有用的,它可以在浏览器中存储信息,这样的信息可以被共享在不同的页面,浏览会话. 在最近的过去,这将有可能只被cookies文本文件保存 ...

  6. 性能:15个JavaScript本地存储技术的函数库和工具

    当构建更复杂的JavaScript应用程序运行在用户的浏览器是非常有用的,它可以在浏览器中存储信息,这样的信息可以被共享在不同的页面,浏览会话. 在最近的过去,这将有可能只被cookies文本文件保存 ...

  7. Smack IQ包的扩展

    前几天一直很烦躁,怎么扩展smack的IQ包堵了我好久,今天静下心来看了下smack的源码,把这个问题解决了.下面给出步骤: 如果我们要扩展一个如下所示的IQ包: <iq id="00 ...

  8. Delphi COM编程技术三类型库(库文件中的工具栏,很全)

    在COM组件的使用和开发过程中经常需要获取有关组件的信息.而COM组件以二进制代码的形式发布,如果不借助特定的工具这些相关信息将难以被获取.通过访问类型库就可以查看COM组件的信息. 一.类型库的基础 ...

  9. Mockito 库、powermock扩展

    转载:http://blog.csdn.net/kittyboy0001/article/details/18709685 Mockito 简介 Mockito 是目前 java 单测中使用比较流行的 ...

随机推荐

  1. MyString

    [摘自C++程序设计语言] MyString.h #include <cstring> #include <iostream> #include <stdexcept&g ...

  2. BeautifulSoup总结

    1. 参考 Beautiful Soup 4.2.0 文档 Beautiful Soup Documentation (4.4.0 英文部分内容有别于4.2.0中文) CSS 选择器参考手册 阮一峰 ...

  3. net core体系-API-Restful+Swagger搭建API

    本篇主要简单介绍下.net core下搭建WebApi 项目结构 项目结构其实不用多说,基本上大同小异. Controller:对外暴露的契约 Business/IBussiness:业务逻辑层实现及 ...

  4. Cow Relays POJ - 3613 (floyd+快速幂)

    For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race usin ...

  5. git 入门教程之删除文件

    删除文件 回忆一下文件的常见操作,新增文件,修改文件,删除文件等,新增和修改文件都单独讨论过,现在我们来研究一下如何删除文件. 你可能会说删除文件还不简单啊,直接 rm -rf <file> ...

  6. h5页面

    <!DOCTYPE html><html lang="utf-8"><head> <meta charset="UTF-8&qu ...

  7. Django跨域、cookie、session

    前后台分离开发 1.前台页面运行在前台服务器上,负责页面的渲染(静态文件的加载)与跳转 2.后台代码运行在后台服务器上,负责数据的处理(提供数据请求的接口) 跨域 什么是跨域? 通常情况下,A网页访问 ...

  8. World Finals 2018 感想

    垃圾比赛卡我读入卡我输出毁我青春.

  9. windows上react-native run-android时Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED报错

    报错如图 解决 在C:\Users\{用户名}\.gradle\wrapper\dists路径下,删除所有文件夹,重新run-android ps:网上搜了说是说是java解压缩编码格式问题什么的,感 ...

  10. MySql数据and高级查询

    1.CREATE TABLE grade(stuID INT AUTO_INCREMENT PRIMARY KEY NOT NULL,stuName VARCHAR(32),stuAge INT ) ...