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节点:

  1. package org.jivesoftware.smack.packet;
  2.  
  3. import org.jivesoftware.smack.packet.PacketExtension;
  4. import org.jivesoftware.smack.util.StringUtils;
  5.  
  6. public class Received implements PacketExtension {
  7.  
  8. public static final String NAME = "received";
  9. public static final String NAME_SPACE = "urn:xmpp:receipts";
  10.  
  11. private String id = "";
  12. private Integer status = 0;
  13.  
  14. /**
  15. * @return the id
  16. */
  17. public String getId() {
  18. return id;
  19. }
  20.  
  21. /**
  22. * @param id the id to set
  23. */
  24. public void setId(String id) {
  25. this.id = id;
  26. }
  27.  
  28. /**
  29. * @return the status
  30. */
  31. public Integer getStatus() {
  32. return status;
  33. }
  34.  
  35. /**
  36. * @param status the status to set
  37. */
  38. public void setStatus(Integer status) {
  39. this.status = status;
  40. }
  41.  
  42. @Override
  43. public String getElementName() {
  44. return "received";
  45. }
  46.  
  47. @Override
  48. public String getNamespace() {
  49. return "urn:xmpp:receipts";
  50. }
  51.  
  52. @Override
  53. public String toXML() {
  54. StringBuilder buffer = new StringBuilder();
  55. buffer.append("<received xmlns=\"urn:xmpp:receipts\"");
  56. buffer.append(" id=\"").append(StringUtils.escapeForXML(id)).append("\"");
  57. buffer.append(" status=\"").append(status).append("\"");
  58. buffer.append("/>");
  59. return buffer.toString();
  60. }
  61. }

  

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

  1. package org.jivesoftware.smack.provider;
  2.  
  3. import org.jivesoftware.smack.packet.PacketExtension;
  4. import org.jivesoftware.smack.packet.Received;
  5. import org.xmlpull.v1.XmlPullParser;
  6.  
  7. public class ReceivedProvider implements PacketExtensionProvider {
  8.  
  9. @Override
  10. public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
  11. boolean done = false;
  12. Received received = new Received();
  13. while (!done) {
  14. int eventType = parser.next();
  15. String name = parser.getName();//XML Tab标签
  16. if (eventType == XmlPullParser.START_TAG) {
  17. if (name.equals("id")) {
  18. received.setId(parser.nextText());
  19. }
  20. if (name.equals("status")) {
  21. received.setStatus(Integer.parseInt(parser.nextText().trim()));
  22. }
  23. }
  24. if (eventType == XmlPullParser.END_TAG) {
  25. if (Received.NAME.equals(name)) {
  26. done = true;
  27. }
  28. }
  29. }
  30. return received;
  31. }
  32.  
  33. }

 

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

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

 

我们想message添加received

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

  

XML的格式

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

 

我们可以这样获得received

  1. 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. ORACLE创建表之前判断表是否存在与SQL Server 对比使用

    在SQL Server 数据库中,我们在创建表之前删除表,有if exit()这样的语句,但是在oracle中却没有.如果直接使用drop table那么如果表不存在会报错,导致后续语句无法运行.因此 ...

  2. ADF_Data Binding系列3_使用Placeholder Data Control

    2015-02-16 Created By BaoXinjian

  3. ruby中proc和lambda的return区别

    学习ruby有一段时间了,但是我看了好几遍proc和lambda的return区别的区别讲解,始终没明白到底什么区别,今天上午又看,终于感觉是茅塞顿开有点领悟了 一下内容部分来自<<rub ...

  4. spring mvc定时任务的简单使用

    版权声明:本文为楼主原创文章,未经楼主允许不得转载,如要转载请注明来源. 说起定时任务,开发的小伙伴们肯定不陌生了.有些事总是需要计算机去完成的,而不是傻傻的靠我们自己去.可是好多人对定时器总感觉很陌 ...

  5. google打不开啦,咋办?

    前言:以前开发的时候一直使用google浏览器,好像是两年前的某一天突然间发现google搜索不能访问了,我喜欢将自己觉得有趣的网页做成标签页,google不能访问只能先换别的了,firefox也挺不 ...

  6. FMDBsqilte语句样式

    举例: @"create table student(stuid integer primary key autoincrement,name text,number integer,the ...

  7. 2016-08-15: C++ traits

    #include <stdio.h> template <typename T> struct TraitsHelper { static const bool isPoint ...

  8. Web SQL Database实例

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

  9. MVC导出Excel,提供下载Excel

    类1: using System.Collections.Generic;using System.Data;using System.Web.Mvc;using System.IO;using Sy ...

  10. WampServer服务中MySQL无法正常启动解决方案

    打开wampserver->mysql->my.ini,添加或修改innodb_force_recovery = 1 然后重启所有服务就大功告成了!