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.












相关文章
|
5月前
|
存储 网络协议 Java
网络通信的核心机制:Socket如何实现高效数据传输(上)
网络通信的核心机制:Socket如何实现高效数据传输
|
7月前
数据通信方式
数据通信方式。
85 2
|
编解码 安全 算法
全双工通信 | 带你读《5G系统关键技术详解》之三
本书深入介绍了 5G 无线网络的协议、网络架构和技术,包括无线接入网络、移动边 缘计算、全双工、大规模 MIMO、毫米波、NOMA、物联网、M2M 通信、D2D 通信、 移动数据分流、干扰抑制技术、无线资源管理、可见光通信和智能数据定价等关键主题。
全双工通信  | 带你读《5G系统关键技术详解》之三
|
5G 芯片
带你读《无人机网络与通信》之二:空对地与空对空数据链路通信
本书针对无人机系统两个关键问题—通信组网和管控体系做了比较全面和深入的描述和探讨,特别是以大量笔墨分析了现有无线通信解决方案,对比了不同通信协议,得出了很有价值的研究结论。无人机的跨越式发展将涉及公共安全管理的问题,构建管控体系是当务之急,分级管理以及制定相应的适航标准是一件大事情,本书对此也进行了系统的、建设性的讨论。未来,高档无人机和无人机集群将对环境具有更强的感知能力和自适应能力,还有对任务的自规划和学习、调整能力,本书讨论的内容将为它们的发明、部署和监督提供宝贵的信息。
|
5月前
|
Web App开发 视频直播
浏览器跨标签页通信、双向数据传输、实时通信有什么区别?
浏览器跨标签页通信、双向数据传输、实时通信有什么区别?
35 0
|
5月前
|
存储 安全 Java
网络通信的核心机制:Socket如何实现高效数据传输(中)
网络通信的核心机制:Socket如何实现高效数据传输
|
5月前
|
编解码 Java 网络安全
网络通信的核心机制:Socket如何实现高效数据传输(下)
网络通信的核心机制:Socket如何实现高效数据传输
|
8月前
|
网络协议 开发者 数据格式
WebSocket:实时通信的全双工解决方案
WebSocket是一种基于TCP的实时通信协议,它在Web应用中提供了全双工、持久化的连接,使得服务器和客户端之间可以实时地进行双向通信。本文将介绍WebSocket的特点和优势,探讨它在Web应用中的广泛应用场景。我们还将深入了解WebSocket的工作原理和使用方法,帮助开发者了解如何利用WebSocket构建高效、实时的Web应用。
184 0
|
11月前
|
存储 并行计算 安全
指令流和数据流
指令流和数据流
272 0
|
网络协议 网络架构
网络通信流程的描述
数据从发送者的应用层传递到传输层,封装端口信息,将数据传递给网络层,封装原IP,目的IP,这时计算机发发现目的IP为外网IP,就会将该数据发给自己的网关,于是数据到达链路层,链路层首先去查看ARP表,查看里面是否记录了网关的mac地址,如果没有记录,主机调用APR协议,广播得到网关的mac地址,并且更新路由表,然后封装原mac为主机的mac,目的mac为网关的mac,将数据传递给网关。
网络通信流程的描述