XMPP常用协议(二)

2024-06-13 06:18
文章标签 协议 常用 xmpp

本文主要是介绍XMPP常用协议(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一篇主要介绍发送消息,发送和接收到的XML格式。

8. 发送文本消息

因为Android 中直接在Message 根目录扩展多个节点比较麻烦,所以我们这边只扩展了一个节点,然后在这个节点内部添加多个子节点来传递内容。

发送消息时,如果对方离线时,body又为空,则对方上线时,并不会收到这条消息(推测Openfire服务器并未存储body为空的离线消息,一定得保证body不为空)。

<message type="chat" to="1001@duimy/iOS" id="E1B3BC0C-1F32-40BC-9AF3-162F30D5AE0D"> <body>1</body>  <messagebody> <textbody>温馨呢就几乎</textbody> </messagebody> 
</message>

body 节点,我们用来传递消息类型,messagebody 节点是消息的内容。

iOS 中的代码段:

XMPPMessage *xmppMessage = [XMPPMessage messageWithType:type to:toJID.bareJID];
[xmppMessage addAttributeWithName:@"id" stringValue:[HLCoreManager manager].stream.generateUUID];
NSString *msgType = [NSString stringWithFormat:@"%ld", self.body.type];
[xmppMessage addBody:msgType];  // body 中存的是消息的类型
// 插入其他节点
XMPPElement *msgBody = [XMPPElement elementWithName:@"messagebody"];
[msgBody addChild:[XMPPElement elementWithName:@"textbody" stringValue:body.text]];
[xmppMessage addChild:msgBody];[[HLCoreManager manager] sendElement:xmppMessage completion:^(XMPPElement *element, NSError *error) {//4.对HLMessage 补充参数,比如服务器时间、发送状态等。if (error) {aMessage.status = HLMessageStatusFailed;} else {aMessage.status = HLMessageStatusSuccessed;}//5.更新Message数据库//6.更新会话的最后一条消息if ([NSThread isMainThread]) {aCompletionBlock(aMessage, error);} else {dispatch_async(dispatch_get_main_queue(), ^{aCompletionBlock(aMessage, error);});}}];

Android 里代码段:

Message message = new Message(dmMessage.getTo());
// 2.将消息通过Smack 发送出去
if (dmMessage.getChatType() == DMConversation.Chat) {message.setType(Message.Type.chat);
} else {message.setType(Message.Type.groupchat);
}
message.addBody(null, String.valueOf(dmMessage.getType()));
// 为Message 添加子节点
message.addExtension(dmMessage.getBody());
//发送消息
dmCore.getConnection().sendStanza(message);

其中,扩展节点对象是继承自ExtensionElement,需要重写如下方法:

    @Overridepublic CharSequence toXML() {XmlStringBuilder buf = new XmlStringBuilder();buf.openElement(getElementName());buf.element(textBoadyTag, textbody);buf.closeElement(getElementName());return buf;}

8.1 收到的XML

接收到的XML分两种情况,当接受者在线时:

<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="E1B3BC0C-1F32-40BC-9AF3-162F30D5AE0D" from="1002@duimy/iOS">  <body>1</body>  <messagebody> <textbody>温馨呢就几乎</textbody> </messagebody> 
</message>

接受者不在线,当其上线时,接受到的XML:

<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="9590CEFC-6BA3-4506-837C-EA2AA3CACF2E" from="1002@duimy/iOS">  <body>1</body>  <messagebody> <textbody>温馨呢就几乎</textbody> </messagebody>  <delay xmlns="urn:xmpp:delay" from="duimy" stamp="2017-06-26T02:47:14.140Z"></delay> 
</message>

9.发送定位消息的XML

发送消息时,如果对方离线时,body又为空,则对方上线时,并不会收到这条消息(推测Openfire服务器并未存储body为空的离线消息,一定得保证body不为空)。

<message type="chat" to="1001@duimy/iOS" id="AC3B22D1-6DEC-42D2-A0E1-25B6777C5F3C"> <body>4</body>  <messagebody> <latitude>22.554248</latitude>  <longitude>113.949618</longitude>  <address>北京市东城区中华路甲10号</address> </messagebody> 
</message>

接受者在线时,接收到的XML

<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="24275F68-D3DA-42A4-91F8-AB04DE0BF8B3" from="1002@duimy/iOS">  <body>4</body>  <messagebody> <latitude>22.554248</latitude>  <longitude>113.949618</longitude>  <address>北京市东城区中华路甲10号</address> </messagebody> 
</message>

接收者离线,当其上线时,收到的XML

<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="AC3B22D1-6DEC-42D2-A0E1-25B6777C5F3C" from="1002@duimy/iOS">  <body>4</body>  <messagebody> <latitude>22.554248</latitude>  <longitude>113.949618</longitude>  <address>北京市东城区中华路甲10号</address> </messagebody>  <delay xmlns="urn:xmpp:delay" from="duimy" stamp="2017-06-26T03:14:04.540Z"></delay> 
</message>

10.发送图片消息

发送图片消息分为两步,第一步,请求服务器端上传接口,把图片上传到服务器,服务器返回一个图片路径。
第二步,将服务器端远程路径封装到Message 的XML里,发送出去。
在这里,第一步的就不介绍了,主要展示一下第二步发送的XML:

<message type="chat" to="1002@duimy/iOS" id="CD0F9279-8088-4592-BA36-D31F2C165C04"> <body>2</body>  <messagebody>  <remotepath>http://192.168.1.166:8080/upload/pic/04cd8912-2af5-49f6-8a5c-6d95fa6ff326.png</remotepath>  <width>750</width>  <height>499</height>  <fileLength>707397</fileLength> </messagebody> 
</message>

收到的图片消息XML:

<message xmlns="jabber:client" type="chat" to="1002@duimy/iOS" id="CD0F9279-8088-4592-BA36-D31F2C165C04" from="1001@duimy/iOS"><body>2</body>  <messagebody>  <remotepath>http://192.168.1.166:8080/upload/pic/04cd8912-2af5-49f6-8a5c-6d95fa6ff326.png</remotepath>  <width>750</width>  <height>499</height>  <fileLength>707397</fileLength> </messagebody>
</message>

收到的离线图片消息XML:

<message xmlns="jabber:client" type="chat" to="1002@duimy/iOS" id="CD0F9279-8088-4592-BA36-D31F2C165C04" from="1001@duimy/iOS"><body>2</body>  <messagebody>  <remotepath>http://192.168.1.166:8080/upload/pic/04cd8912-2af5-49f6-8a5c-6d95fa6ff326.png</remotepath>  <width>750</width>  <height>499</height>  <fileLength>707397</fileLength> </messagebody><delay xmlns="urn:xmpp:delay" from="duimy" stamp="2017-07-06T06:15:52.757Z"></delay>
</message>

11.发送语音类型的消息

发送语音类型的消息与发送图片类型的消息一样,都是先将语音附件上传至服务器,再封装消息内容发送出去。
发送的XML:

<message type="chat" to="1001@duimy/iOS" id="ADB92A65-A38E-4699-90A8-0A1B120921D2"> <body>5</body>  <messagebody> <remotepath>http://192.168.1.166:8080/upload/sound/5c2dfdab-6818-4425-b46e-4c4a350fa528.wav</remotepath>  <duration>1</duration>  <fileLength>87812</fileLength> </messagebody> 
</message>

接受到的语音类消息XML:

<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="BE2A5D79-883C-444B-8C4E-3842753577FD" from="1002@duimy/iOS"><body>5</body>  <messagebody> <remotepath>http://192.168.1.166:8080/upload/sound/5c2dfdab-6818-4425-b46e-4c4a350fa528.wav</remotepath>  <duration>1</duration>  <fileLength>87812</fileLength> </messagebody>
</message>

接受到的离线语音类消息XML:

<message xmlns="jabber:client" type="chat" to="1001@duimy/iOS" id="BE2A5D79-883C-444B-8C4E-3842753577FD" from="1002@duimy/iOS"><body>5</body>  <messagebody> <remotepath>http://192.168.1.166:8080/upload/sound/5c2dfdab-6818-4425-b46e-4c4a350fa528.wav</remotepath>  <duration>1</duration>  <fileLength>87812</fileLength> </messagebody><delay xmlns="urn:xmpp:delay" from="duimy" stamp="2017-07-06T06:15:52.757Z"></delay>
</message>

这篇关于XMPP常用协议(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056498

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,