Asmack开发系列之通信数据流

简介:

上一节,我们介绍了XMPP的基础,还没说完,说到了通信洪流,然后就结束了。这一节,我们接着讲。主要是“stanzas”(节).上一节,我们说,区分stanzas,需要从它的名字,属性TYPE和子节点来区分。这一节,我们分别介绍:消息(Message),出席/上线(Presence),信息查询(IQ)以及可扩展性(Extensibility)。

1,消息(Message)

消息<message/>是xmpp中的一种典型的“推”(Push)方法,它不需要回复,属于一种阅后即焚的的机制。适用于IM,Groupchat,alert和Notification。根据它的type属性可以分为:

1)常规(normal)

常规的消息特别像邮件消息,因为你给别人发的消息,别人可以回,也可以不回。

2)对话(chat)

对话消息是两个实体之间的实时对话,例如你和你的qq好友在聊天。

3)群组对话(GroupChat)

使用在多人的对话房间里面。

4)头条(Headline)

头条用来发送警告和通告,这种消息不需要回复。

5)错误(Error)

这种消息一般来说是对某一条消息的回复,告诉对方什么出错了。

Message出了Type这个属性,还有其他属性:
1)to 要去哪里,就是跟你对话的那个是谁(JID);
2)from,从来里来。其实你发消息给别人,from就是你,但是,这个from字段貌似不是由你来填充,而是由你的服务器来填充,为什么要这么做呢?其实,如果让你填充,你明明是张三,你填个李四过去,那岂不是欺骗(Spoofing)么。对不对。
3)id。标示这个消息是独一无二的。在调试的时候特别有用
然后,Message也可以有负载,也就是子节点。例如<body/>和<subject/>,用在一对一的对话中。
给大家一个示例:
<message from="madhatter@wonderland.lit/foo"
to="alice@wonderland.lit"
type="chat">
<body>Who are you?</body>
<subject>Query</subject>
</message>

2,出席(Presence)

 这是实时通信和其他应用不同的特性之一。出席完成什么一件事情呢?其实就是,你的QQ好友上线了,然后你的QQ列表就会把它头像点亮。这个过程就是,首先你订阅了人家的这种出席消息,也就是一般来说人家是你好友,默认是订阅的,当然他可以拒绝你的订阅(在线对其隐身)。所以Presence是一种“Publish-subscribe”发布-订阅的模式。
一个Presence的消息示例如下:
<presence from="alice@wonderland.lit/pda">
<show>xa</show>
<status>down the rabbit hole!</status>
</presence>

3,信息查询(IQ)

信息查询Info/Query(IQ)提供一种请求-响应(Request-Response)的机制,有点像HTTP里面的GET,POST,PUT方法。和<message/>不一样,IQ包只能够有一个负载,即只能够有一个子节点。而且IQ包一个请求它是必须得到响应的,这个响应可能来自对方,或者对方的服务器(这点好理解,因为当对方不可达的时候)。IQ包的Id非常重要,你请求过去的IQ包,包含一个id,而它回复的时候这个id依然是作为包的id,这样来表示对你该次请求的回应。
IQ包的type属性包含:
1)get (请求)。这种请求是向对方请求信息,类似于HTTP GET。
2)set(设置)。这个类似于HTTP POST 或者PUT。
3)result(结果)。get请求的结果,或者是set的回复(类似于HTTP 200状态码)。
4)error(错误)。当对方无法满足你的需求的时候,它会返回一个错误给你,或者它的服务器返回一个错误给你。

一个查询花名册的IQ包:
<iq from="alice@wonderland.lit/pda" 
id="rr82a1z7"
to="alice@wonderland.lit" 
type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
回复:
<iq from="alice@wonderland.lit" 
id="rr82a1z7"
to="alice@wonderland.lit/pda" 
type="result">
<query xmlns="jabber:iq:roster">
<item jid="whiterabbit@wonderland.lit"/>
<item jid="lory@wonderland.lit"/>
<item jid="mouse@wonderland.lit"/>
<item jid="sister@realworld.lit"/>
</query>
</iq>

添加一个成员到花名册:
<iq from="alice@wonderland.lit/pda"
id="ru761vd7"
to="alice@wonderland.lit" 
type="set">
<query xmlns="jabber:iq:roster">
<item jid="madhatter@wonderland.lit"/>
</query>
</iq>

回复:
<iq from="alice@wonderland.lit" 
id="ru761vd7"
to="alice@wonderland.lit/pda" 
type="result"/>

它和服务器的交互过程入下图所示:
4,可扩展性
因为是基于XML的,所以可扩展性非常好,具体就这里不讲了。

5,源码解析
后续我会放出这部分的源码解析,尽请期待,同事约打CS了。88.












相关文章
数据通信方式
数据通信方式。
200 2
|
存储 网络协议 Java
网络通信的核心机制:Socket如何实现高效数据传输(上)
网络通信的核心机制:Socket如何实现高效数据传输
|
编解码 安全 算法
全双工通信 | 带你读《5G系统关键技术详解》之三
本书深入介绍了 5G 无线网络的协议、网络架构和技术,包括无线接入网络、移动边 缘计算、全双工、大规模 MIMO、毫米波、NOMA、物联网、M2M 通信、D2D 通信、 移动数据分流、干扰抑制技术、无线资源管理、可见光通信和智能数据定价等关键主题。
全双工通信  | 带你读《5G系统关键技术详解》之三
|
2月前
|
IDE 开发工具
【通信协议讲解】单片机基础重点通信协议解析与总结之CAN(四)
【通信协议讲解】单片机基础重点通信协议解析与总结之CAN(四)
|
5月前
|
消息中间件 负载均衡 中间件
中间件设计数据流
【7月更文挑战第8天】
51 3
|
编解码 Java 网络安全
网络通信的核心机制:Socket如何实现高效数据传输(下)
网络通信的核心机制:Socket如何实现高效数据传输
|
存储 安全 Java
网络通信的核心机制:Socket如何实现高效数据传输(中)
网络通信的核心机制:Socket如何实现高效数据传输
|
网络协议 开发者 数据格式
WebSocket:实时通信的全双工解决方案
WebSocket是一种基于TCP的实时通信协议,它在Web应用中提供了全双工、持久化的连接,使得服务器和客户端之间可以实时地进行双向通信。本文将介绍WebSocket的特点和优势,探讨它在Web应用中的广泛应用场景。我们还将深入了解WebSocket的工作原理和使用方法,帮助开发者了解如何利用WebSocket构建高效、实时的Web应用。
361 0
|
存储 并行计算 安全
指令流和数据流
指令流和数据流
346 0
|
C#
C#网络应用编程,实验5:数据流练习
C#网络应用编程,实验5:数据流练习
124 1
C#网络应用编程,实验5:数据流练习