扩展Smack Message
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的更多相关文章
- Smack Message扩展,添加自定义元素(标签)经验分享
Smack框架对XMPP协议进行了封装,从而方便与Openfire即时通信服务器做交互.说白了,Smack框架可以通过对象构造符合XMPP协议的XML字符串,避免手动拼接字符串. XMPP协议基本XM ...
- 谷歌扩展程序--------------Message
转载:https://developer.chrome.com/extensions/messaging#external-webpage Message Passing Since content ...
- Smack IQ包的扩展
前几天一直很烦躁,怎么扩展smack的IQ包堵了我好久,今天静下心来看了下smack的源码,把这个问题解决了.下面给出步骤: 如果我们要扩展一个如下所示的IQ包: <iq id="00 ...
- #pragma message的作用
一般情况下,#pragma message( messagestring )是在编译期间,将一个文字串(messagestring)发送到标准输出窗口.典型的使用方法是在编译时报告和显示信息.下面的代 ...
- WCF 扩展一:格式化Web服务请求XML
扩展原因 有一WebService,在工程中添加Web Service引用后调用不成功,但是用SoapUI测试正常 分析 用tctTrace跟踪报文后发现wcf生成的报文命名空间与SoapUI的不一样 ...
- Google Protocol Buffer 简单介绍
以下内容主要整理自官方文档. 为什么使用 Protocol Buffers .proto文件 Protocol Buffers 语法 编译.proto文件 Protocol Buffers API 枚 ...
- Protocol Buffer使用
Protocol Buffer使用简介 字数2630 阅读5067 评论1 喜欢12 我们项目中使用protocol buffer来进行服务器和客户端的消息交互,服务器使用C++,所以本文主要描述pr ...
- james+javamail入门
James+Javamail构建邮件服务(一) 本文描述如何使用James搭建具备一定邮件过滤.邮件操作功能的邮件服务器,以及使用Javamail实现对James服务器邮件的收发功能. 1关于Jame ...
- protobuf 编码实现解析(java)
一:protobuf编码基本数据类型 public enum FieldType { DOUBLE (JavaType.DOUBLE , WIRETYPE_FIXED64 ), FLOAT (Java ...
随机推荐
- 解决Linux性能问题的前60秒
为了解决性能问题,你登入了一台Linux服务器,在最开始的一分钟内需要查看什么? 在Netflix我们有一个庞大的EC2 Linux集群,还有非常多的性能分析工具来监控和调查它的性能.其中包括用于云监 ...
- python---PrettyTable
简介 Python通过prettytable模块将输出内容如表格方式整齐输出,python本身并不内置,需要独立安装该第三方库. 安装 pip install PrettyTable #源码安装 wg ...
- 关于oracle修复控制文件与数据文件不一致的问题----
本小菜鸟周末鼓捣数据库关于rman恢复与备份方面的实验,结果不知道哪根筋搭错了,手一哆嗦,做了不知道什么操作,就出现了数据库打不开的严重状态,只能开启到mount状态,但是切换到open状态时就会报错 ...
- [Linux] Linux下谁在消耗我们的cache
一.缘由: 曾经看到MySQL服务器上Cache占用特别大,其实大家都知道这是合理的,这些都是可用内存: 那么问题来了,是谁在占用这些Cache呢?如果去掉不合理的Cache占用,系统内存会更充分的得 ...
- 异步数据库查询 Z
Introduction Microsoft .NET 4.5 introduced new "async and await" methods to provide an eas ...
- mysql 数据库乱码解决
mysql 数据库乱码解决, 进入前加入 set names 'utf8' 即可.
- [IIS]IIS扫盲(八)
iis - IIS之FTP服务器 一.建立你的FTP站点 第一个FTP站点(即“默认FTP站点”)的设置方法和更多FTP站点的建立方法请参照前文Web服务器中相关操作执行.需要注意的是,如果你要用一 ...
- Change the Windows 7 Taskbar Thumbnail and List Mode
Manually in Registry Editor 1. Open the Start Menu, then type regedit in the search boxand press Ent ...
- 【练习】flushback基于时间的闪回查询
1.创建table t1 :: SCOTT@ORA11GR2>create table t1 as select * from scott.emp; Table created. :: SCOT ...
- 洛谷P3371 【模板】单源最短路径
P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...