即时通讯XMPP常用协议(二)

来源: csdn 2020-02-27 04:04:34

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>

1

2

3

4

5

6

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

            });

        }

    }];

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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

1

2

3

4

5

6

7

8

9

10

11

12

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


    @Override

    public CharSequence toXML() {


        XmlStringBuilder buf = new XmlStringBuilder();

        buf.openElement(getElementName());


        buf.element(textBoadyTag, textbody);


        buf.closeElement(getElementName());


        return buf;

    }

1

2

3

4

5

6

7

8

9

10

11

12

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>

1

2

3

4

5

6

接受者不在线,当其上线时,接受到的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>

1

2

3

4

5

6

7

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>

1

2

3

4

5

6

7

8

接受者在线时,接收到的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>

1

2

3

4

5

6

7

8

接收者离线,当其上线时,收到的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>

1

2

3

4

5

6

7

8

9

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>

1

2

3

4

5

6

7

8

9

收到的图片消息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>

1

2

3

4

5

6

7

8

9

收到的离线图片消息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>

1

2

3

4

5

6

7

8

9

10

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>

1

2

3

4

5

6

7

8

接受到的语音类消息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>

1

2

3

4

5

6

7

8

接受到的离线语音类消息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>

1

2

3

4

5

6

7

8

9


————————————————









-------------------------------------------------------

相关文章

即时通讯

即时通讯im

什么是私有云?

im 移动社交聊天APP

Im通讯有哪些APP

如何选择即时通讯软件?

推荐一款好用的企业办公聊天APP

使用企业IM要不要收费

IM软件要多少钱?‍‍有必要定制么?

有没有必要开发企业聊天APP

企业IM是什么,有什么使用优势?

哇谷IM有什么特点,为什么很多企业在使用?

即时通讯私有化部署是什么?

企业即时通讯的使用价值有哪些

企业聊天APP有什么作用,可以带来哪些便利?

企业即时通讯软件支持多设备登陆吗?

购买海外云服务器注意避免这些误区

怎么样正确认识海外云服务器

员工上网影响效率 关闭外网做内网必备聊天APP

即时通讯软件是否具有聊天回执的功能?

即时通讯聊天APP是否支持消息漫游

即时通讯软件可以发送表情和语音么?

即时通讯软件支持群聊和音视频功能么?

有微信有QQ,为啥还要定制即时通讯软件?

IM软件功能丰富 随心所欲定制您需要的功能

盘点全球几大即时通讯软件

介绍两款国外大佬级别的即时通讯APP

原创互联网未来世界企业政府通讯APP办公节约成本类似马云思维-哇谷IM

免费十万SEO优化超级外链工具各大站长工具

敲黑板,企业聊天APP这些事项一定要注意!

JM沟通优势有哪些,安全性怎么样?

JM沟通app即时通讯聊天系统功能介绍

jm沟通 企业即时通讯有什么特点,为什么受欢迎?

JM沟通实现零距离交流 成现代企业办公的必备

即时通讯私有化完整版源代码分析后台数据库说明

即时通讯IM融云世界

新的市场叫板环信、融云、腾讯云!开源版IM即使聊天工具

公有云和私有云之间有什么区别?类似融云、环信云、网易云、哇谷云?

IM云系统即时通讯公有云、私有云、企业云、海外云-哇谷IM团队

2.0哇谷即时通讯系统正式上线适合大型项目运营超稳定性

哇谷科技JM沟通即时通讯内核升级新版哇谷2.0即将上线

im即时通讯社交软件APP红包技术分析(五):微信红包、聊呗红包、诚信红包、高并发技术

im即时通讯-微信红包、支付宝红包、聊呗红包、诚信红包、谈功能逻辑、容灾、运维、架构等。Q红包

更多文章

.

 企业即时通讯服务 | 商用红包功能构架 | 哇谷IM首页 | JM沟通IM下载 | IM功能与价格 | 即时通讯动态 | 热门动态 | 关于哇谷 |联系我们