Smack Message扩展,添加自定义元素(标签)经验分享
Smack框架对XMPP协议进行了封装,从而方便与Openfire即时通信服务器做交互。说白了,Smack框架可以通过对象构造符合XMPP协议的XML字符串,避免手动拼接字符串。
XMPP协议基本XML结构如下:
<message
from='发送方jid'
to='接收方jid'
type='消息类型(普通消息/群聊)'>
<body>消息内容</body>
</message>
大多数情况下,这么简单的结构是满足不了需求的,我们可能会尝试向message元素下增加子元素,用来描述更多信息。
比如,除了发送方的jid,我们想直接带上发送方的昵称和头像URL,这样可以避免反复从数据库中查询这些基本信息。但这个看似简单的过程,在Smack中实现的却相当隐晦,接下来直接通过代码说明。
发送消息基本流程
//build chat
Chat chat = chatManager.createChat("对方jid"); //build extension
UserInfo4XMPP userInfo4XMPP = new UserInfo4XMPP();
userInfo4XMPP.setNameText("菜鸟");
userInfo4XMPP.setUrlText("http://www.liaoku.org/"); //build message
Message message = new Message();
message.setBody("hello 你好"); //消息内容
message.addExtension(userInfo4XMPP); //添加扩展内容 //send
chat.sendMessage(message);
UserInfo4XMPP 定义
import org.jivesoftware.smack.packet.ExtensionElement; /**
* 为Message扩展用户信息
* @author 杨元(转载不注明出处可耻,原文请搜索[杨元博客])
* @version 创建时间:2015年5月11日 下午4:55:38
*/
public class UserInfo4XMPP implements ExtensionElement{ //用户信息元素名称
private String elementName = "userinfo";
//用户昵称元素名称
private String nameElement = "name";
//用户头像地址元素名称
private String urlElement = "url";
//用户昵称元素文本(对外开放)
private String nameText = "";
//用户头像地址元素文本(对外开放)
private String urlText = ""; @Override
public String getElementName() {
return elementName;
} /**
* 返回扩展的xml字符串
* 此字符串作为message元素的子元素
*/
@Override
public CharSequence toXML() {
StringBuilder sb = new StringBuilder(); sb.append("<");
sb.append(elementName);
sb.append(">"); sb.append("<");
sb.append(nameElement);
sb.append(">");
sb.append(nameText);
sb.append("</");
sb.append(nameElement);
sb.append(">"); sb.append("<");
sb.append(urlElement);
sb.append(">");
sb.append(urlText);
sb.append("</");
sb.append(urlElement);
sb.append(">"); sb.append("</");
sb.append(elementName);
sb.append(">"); return sb.toString();
} /**
* 可忽略
*/
@Override
public String getNamespace() {
return "";
} public String getNameText() {
return nameText;
} public void setNameText(String nameText) {
this.nameText = nameText;
} public String getUrlText() {
return urlText;
} public void setUrlText(String urlText) {
this.urlText = urlText;
}
}
简单说明下,关键是实现ExtensionElement接口,然后实现自己的toXML方法,将要扩展的XML字符串返回即可,此字符串将作为message元素的子元素。
生成的message xml 结构
<message id='76Ws9-11'>
<body>hello 你好</body>
<userinfo>
<name>菜鸟</name>
<url>http://www.liaoku.org/</url>
</userinfo>
</message>
基本流程就是这样了,希望对读者有所帮助。
Smack Message扩展,添加自定义元素(标签)经验分享的更多相关文章
- 扩展Smack Message
XMPP是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性. Smack是一个开源的用 java 写的XMPP(jabber)客户端代码库 因为XMPP是XML,所以进行 ...
- 灵魂代码分享HTML元素标签语义化及使用场景实用到爆
灵魂三问: 标签语义化是什么?为什么要标签语义化?标签语义化使用场景有哪些? 下面让我们跟着这三个问题来展开一下本文的内容. 一.标签语义化是什么? 标签语义化就是让元素标签做适当的事情.例如 p 标 ...
- 关于启用 HTTPS 的一些经验分享(二)
转载: 关于启用 HTTPS 的一些经验分享(二) 几天前,一位朋友问我:都说推荐用 Qualys SSL Labs 这个工具测试 SSL 安全性,为什么有些安全实力很强的大厂家评分也很低?我认为这个 ...
- Expression Blend4经验分享:制作一个简单的图片按钮样式
这次分享如何做一个简单的图片按钮经验 在我的个人Silverlight网页上,有个Iphone手机的效果,其中用到大量的图片按钮 http://raimon.6.gwidc.com/Iphone/de ...
- 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)
简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...
- Kaggle 数据挖掘比赛经验分享(转)
原作者:陈成龙 简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比 ...
- Kaggle 数据挖掘比赛经验分享
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 腾讯广告算法大赛 作者 | 陈成龙 Kaggle 于 2010 年创立,专注数据科学,机器学 ...
- 关于启用 HTTPS 的一些经验分享(一)
转载: 关于启用 HTTPS 的一些经验分享(一) 随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站 HTTPS.就在今天,免费提供证书服务的 Let's Encrypt ...
- Expression Blend4经验分享:自适应布局浅析
今天分享一下Blend制作自适应分辨率布局的经验,大家先看下效果图: 这是一个标准的三分天下的布局,两侧的红色区域是背景区域,是用来干吗的呢,下面简单的分析一下,大家就明白了. 1.拿到一个项目,进行 ...
随机推荐
- Android 图片添加水印图片或者文字
给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- 从多列的DataTable里取需要的几列(转)
方法一: 也是广为人知的一种: YourDataTable.Columns.Remove("列名"); 但是这种情况只适合于去掉很少列的情况. 如果有很多列我却只要一两列呢,那就得 ...
- C语言打印最长字符串
编程在一个已知的字符串中找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词. ]; printf("请输入字符串:"); fgets(p, , stdin); ; ; ; ...
- response.setHeader()的用法
一秒刷新页面一次 response.setHeader("refresh","1"); 二秒跳到其他页面 response.setHeader("re ...
- 20.cocoapods的安装和使用
一.CocoaPods是什么? CocoaPods是一个负责管理iOS项目中第三方开源库的工具.CocoaPods的项目源码在Github上管理.该项目开始于2011年8月12日,在这两年多的时间里, ...
- 【CronExpression表达式详解和案例】
1. cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 2. cron表达式各占位符解释: {秒数} ==> 允许值范围: 0~59 ,不允许 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- <<你最喜欢做什么--兴趣问题清单>>总结
二.测试作业 你最喜欢做什么--兴趣问题清单 •根据迄今为止已有的经历,你真正喜欢从事的工作是什么? 目前还没有接触工作,就工作而言,凭自己所学的本领和技术去工作,我认为我会喜欢我所做的工作 •休 ...
- WEB开发之路——基础部分
WEB开发之路 受BBC的<BBC: Brain Story>和<BBC: The Brain - A Secret History>的影响,我一直有志于探究人类大脑,2015 ...
- NSString进行urlencode编码
今天在项目开发过程中,需要给webView传一个url,但是web端需要我将url中的一个变量进行urlencoding编码.这个主要原因是怕这个参数中存在一些转义字符,ok!这个没有问题,一开始我只 ...