扩展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);

  

时间: 2024-10-14 09:37:02

扩展Smack Message的相关文章

Smack Message 扩展属性

由于XMPP不支持群聊很多本地化的服务, 针对Openfire开发插件解决问题: Message 扩展: Message videoMsg = new Message();VideoChatRTP videoXml = new VideoChatRTP();//扩展类型videoXml.setVideoType(VideoMediaType.REQUEST);//请求类型videoXml.setAddress(address);//地址videoMsg.setTo(receive);videoM

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

Smack框架对XMPP协议进行了封装,从而方便与Openfire即时通信服务器做交互.说白了,Smack框架可以通过对象构造符合XMPP协议的XML字符串,避免手动拼接字符串. XMPP协议基本XML结构如下: 1 <message 2 from='发送方jid' 3 to='接收方jid' 4 type='消息类型(普通消息/群聊)'> 5 <body>消息内容</body> 6 </message> 大多数情况下,这么简单的结构是满足不了需求的,我们可

Smack IQ包的扩展

前几天一直很烦躁,怎么扩展smack的IQ包堵了我好久,今天静下心来看了下smack的源码,把这个问题解决了.下面给出步骤: 如果我们要扩展一个如下所示的IQ包: <iq id="0001" to="[email protected]" type=”get”> <query xmls="emcc.jiyq" condition="what"/> <extrament>element</

#pragma message预编译指令使用技巧

一般情况下,#pragma message( messagestring )是在编译期间,将一个文字串(messagestring)发送到标准输出窗口.典型的使用方法是在编译时报告和显示信息.下面的代码段是编译期间在标准输出窗口显示一条消息: #if _M_IX86 == 500#pragma message( "Pentium processor build" )#endif messagestring 参数可以将文字串常量扩展成一个宏,从而可以显示任何形式的字符串.例如,下面的语句

java mysql自定义函数UDF之调用c函数

正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. google "mysql call c function"发现一片文章 MySQL User Defined Functions  This tutorial explains what an User Defined Function (UDF) is, what it does and w

JAIN SIP API 简介

摘要 本文介绍如何在 Java SE 上使用会话发起协议 (SIP) 开发客户端应用程序.文中展示 JAIN SIP API 这种强大的"SIP 堆栈".首先介绍一个简单的 IM 应用程序,然后对其进行剖析来了解该技术. 关于 JAIN SIP API 集成网络 Java API (JAIN) 是一个管理电信标准的 JCP 工作组.会话发起协议 (SIP) 是一种标准通信协议,之前的文章中已对其进行了讨论.将 Java 与 SIP 结合起来就得到了 JAIN SIP API,这是一种强

sass 语法

sass有两种后缀名文件:一种后缀名为sass,不使用大括号和分号:另一种就是我们这里使用的scss文件,这种和我们平时写的css文件格式差不多,使用大括号和分号.而本教程中所说的所有sass文件都指后缀名为scss的文件.在此也建议使用后缀名为scss的文件,以避免sass后缀名的严格格式要求报错. /*定义变量*/$fontStack: Helvetica,sans-serif;$primaryColor:#333;body{ font-family: $fontStack; color:

Office Add-in Model 为 Mail Add-in 提供的 JavaScript API 介绍

本文所讨论的 Mailbox API是指在 Mail Add-in 中可调用的 JavaScript API.开发者可以利用这些API 实现 Add-in 和 Outlook 的交互(数据读取与写入).希望大家通过这个简单的介绍,认识到 Office Add-In Model 为开发者提供了多大程度和邮件打交道的能力,如果碰巧有正准备开发 Mail Add-in 的同学, 不妨快速扫下 API 列表,然后衡量下它们能不能支撑你完成自己的 Scenarios. 开始之前,需要明确几个问题: 本文中

james+javamail入门

James+Javamail构建邮件服务(一) 本文描述如何使用James搭建具备一定邮件过滤.邮件操作功能的邮件服务器,以及使用Javamail实现对James服务器邮件的收发功能. 1关于James与Javamail Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP.POP3与NNTP等多种邮件相关协议.James是一个 邮件应用平台,可以通过Mailet扩充其功能,如M