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

相关文章

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举