扩展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 ...
随机推荐
- ORACLE创建表之前判断表是否存在与SQL Server 对比使用
在SQL Server 数据库中,我们在创建表之前删除表,有if exit()这样的语句,但是在oracle中却没有.如果直接使用drop table那么如果表不存在会报错,导致后续语句无法运行.因此 ...
- ADF_Data Binding系列3_使用Placeholder Data Control
2015-02-16 Created By BaoXinjian
- ruby中proc和lambda的return区别
学习ruby有一段时间了,但是我看了好几遍proc和lambda的return区别的区别讲解,始终没明白到底什么区别,今天上午又看,终于感觉是茅塞顿开有点领悟了 一下内容部分来自<<rub ...
- spring mvc定时任务的简单使用
版权声明:本文为楼主原创文章,未经楼主允许不得转载,如要转载请注明来源. 说起定时任务,开发的小伙伴们肯定不陌生了.有些事总是需要计算机去完成的,而不是傻傻的靠我们自己去.可是好多人对定时器总感觉很陌 ...
- google打不开啦,咋办?
前言:以前开发的时候一直使用google浏览器,好像是两年前的某一天突然间发现google搜索不能访问了,我喜欢将自己觉得有趣的网页做成标签页,google不能访问只能先换别的了,firefox也挺不 ...
- FMDBsqilte语句样式
举例: @"create table student(stuid integer primary key autoincrement,name text,number integer,the ...
- 2016-08-15: C++ traits
#include <stdio.h> template <typename T> struct TraitsHelper { static const bool isPoint ...
- Web SQL Database实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MVC导出Excel,提供下载Excel
类1: using System.Collections.Generic;using System.Data;using System.Web.Mvc;using System.IO;using Sy ...
- WampServer服务中MySQL无法正常启动解决方案
打开wampserver->mysql->my.ini,添加或修改innodb_force_recovery = 1 然后重启所有服务就大功告成了!