XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。

Smack是一个开源的用 java 写的XMPP(jabber)客户端代码库

因为XMPP是XML,所以进行扩展十分方便。而Smack也提供了对Message扩展的支持。

Smack对Message扩展主要需要两个接口

org.jivesoftware.smack.packet.PacketExtension
org.jivesoftware.smack.provider.PacketExtensionProvider

假设我们需要扩展一个消息回执,需要在Message中定义一个Received节点:

package org.jivesoftware.smack.packet;

import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.util.StringUtils; public class Received implements PacketExtension { public static final String NAME = "received";
public static final String NAME_SPACE = "urn:xmpp:receipts"; private String id = "";
private Integer status = 0; /**
* @return the id
*/
public String getId() {
return id;
} /**
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
} /**
* @return the status
*/
public Integer getStatus() {
return status;
} /**
* @param status the status to set
*/
public void setStatus(Integer status) {
this.status = status;
} @Override
public String getElementName() {
return "received";
} @Override
public String getNamespace() {
return "urn:xmpp:receipts";
} @Override
public String toXML() {
StringBuilder buffer = new StringBuilder();
buffer.append("<received xmlns=\"urn:xmpp:receipts\"");
buffer.append(" id=\"").append(StringUtils.escapeForXML(id)).append("\"");
buffer.append(" status=\"").append(status).append("\"");
buffer.append("/>");
return buffer.toString();
}
}

  

然后我们需要定义一个Received的解析器

package org.jivesoftware.smack.provider;

import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.packet.Received;
import org.xmlpull.v1.XmlPullParser; public class ReceivedProvider implements PacketExtensionProvider { @Override
public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
boolean done = false;
Received received = new Received();
while (!done) {
int eventType = parser.next();
String name = parser.getName();//XML Tab标签
if (eventType == XmlPullParser.START_TAG) {
if (name.equals("id")) {
received.setId(parser.nextText());
}
if (name.equals("status")) {
received.setStatus(Integer.parseInt(parser.nextText().trim()));
}
}
if (eventType == XmlPullParser.END_TAG) {
if (Received.NAME.equals(name)) {
done = true;
}
}
}
return received;
} }

 

我们在使用Smack的时候需要将扩展的Provider添加到ProviderManager

ProviderManager.getInstance().addExtensionProvider(Received.NAME, Received.NAME_SPACE, new ReceivedProvider());

 

我们想message添加received

Message message = new Message();
message.setTo("to");//目标
message.setFrom("from");//来源
Received received = new Received();
received.setId("CJq74-0");//回执的消息ID
received.setStatus(1);//回执状态
message.addExtension(received);
System.out.println(message.toXML());//查看XML

  

XML的格式

<message id="CJq74-1" to="to" from="from"><received xmlns="urn:xmpp:receipts" id="CJq74-0" status="1"/></message>

 

我们可以这样获得received

Received received=(Received)message.getExtension(Received.NAME, Received.NAME_SPACE);

  

扩展Smack Message的更多相关文章

  1. Smack Message扩展,添加自定义元素(标签)经验分享

    Smack框架对XMPP协议进行了封装,从而方便与Openfire即时通信服务器做交互.说白了,Smack框架可以通过对象构造符合XMPP协议的XML字符串,避免手动拼接字符串. XMPP协议基本XM ...

  2. 谷歌扩展程序--------------Message

    转载:https://developer.chrome.com/extensions/messaging#external-webpage Message Passing Since content ...

  3. Smack IQ包的扩展

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

  4. #pragma message的作用

    一般情况下,#pragma message( messagestring )是在编译期间,将一个文字串(messagestring)发送到标准输出窗口.典型的使用方法是在编译时报告和显示信息.下面的代 ...

  5. WCF 扩展一:格式化Web服务请求XML

    扩展原因 有一WebService,在工程中添加Web Service引用后调用不成功,但是用SoapUI测试正常 分析 用tctTrace跟踪报文后发现wcf生成的报文命名空间与SoapUI的不一样 ...

  6. Google Protocol Buffer 简单介绍

    以下内容主要整理自官方文档. 为什么使用 Protocol Buffers .proto文件 Protocol Buffers 语法 编译.proto文件 Protocol Buffers API 枚 ...

  7. Protocol Buffer使用

    Protocol Buffer使用简介 字数2630 阅读5067 评论1 喜欢12 我们项目中使用protocol buffer来进行服务器和客户端的消息交互,服务器使用C++,所以本文主要描述pr ...

  8. james+javamail入门

    James+Javamail构建邮件服务(一) 本文描述如何使用James搭建具备一定邮件过滤.邮件操作功能的邮件服务器,以及使用Javamail实现对James服务器邮件的收发功能. 1关于Jame ...

  9. protobuf 编码实现解析(java)

    一:protobuf编码基本数据类型 public enum FieldType { DOUBLE (JavaType.DOUBLE , WIRETYPE_FIXED64 ), FLOAT (Java ...

随机推荐

  1. LVS安装使用详解

    简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org. ...

  2. 【学】CSS3基础实例2 - box-shadow, border-radius 圆形图标以及内部旋转

    首先要说一下,transition属性ie9是不支持的,从ie10才开始支持 例子是当鼠标移上div后,它会旋转180度. 要点: 用圆角制作圆形盒子,border-radius设置成50%: 用bo ...

  3. jquery判断复选框checkbox是否被选中

    jquery判断复选框checkbox是否被选中 使用is方法 //如果选中返回true //如果未选中返回false .is(':checked');

  4. PHP截断函数mb_substr()详细介绍

    [导读] 在php中mb_substr()函数是用来截中文与英文的函数,可以方便快速的解决截取指定字符长度的问题,下面我来给大家介绍介绍.提示:mb_substr在于php中是默认不被支持的我们需要在 ...

  5. mysql备份还原数据库

    1.备份数据库 mysqldump -u root -p test>/home/victor/test.sql 说明:如果提示找不到mysqldump命令,先用一条find命令查找mysqldu ...

  6. Unity破解for mac

    Mac 版本的破解: 1,确定Unity的版本,然后找到对应的crack包,下载.例如 Unity 4.2.0f4 crack包,我已经放到我的资源里了. 2,解压.这里我解压到了桌面上(也就是 /U ...

  7. 【转】windows7 修改环境变量 和 用不用重启电脑的讨论

      原文:http://www.cnblogs.com/zhenmingliu/archive/2013/02/21/2921396.html   先到我的电脑>属性>高级>环境变量 ...

  8. 39. Recover Binary Search Tree && Validate Binary Search Tree

    Recover Binary Search Tree OJ: https://oj.leetcode.com/problems/recover-binary-search-tree/ Two elem ...

  9. /etc/resolv.conf overwritten. Redhat/Centos

    Prevent /etc/resolv.conf from being blown away by RHEL/CentOS after customizing If you are using RHE ...

  10. 常用的SQL分页

    有关分页 SQL 的资料很多,有的使用存储过程,有的使用游标.本人不喜欢使用游标,我觉得它耗资.效率低:使用存储过程是个不错的选择,因为存储过程是经过预编译的,执行效率高,也更灵活.先看看单条 SQL ...