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.

时间: 2024-09-21 15:55:25

Asmack开发系列之通信数据流的相关文章

Asmack开发系列之XMPP基础

今天,我们来说一下XMPP协议本身的一些东西.毕竟Asmack只是该协议的一个实现版本.所以,我们又必要了解XMPP协议本身. 1,架构 什么是架构,架构就是一系列实体如何组织.联系和交换信息.例如万维网,由成千上万的服务器,他们运行着Apache或者是新的Nginx,客户端由web浏览器,如IE,firefox和Chrome.他们之间交换的数据是HTML,他们之间交换数据的协议是HTTP. 类似的,对于即时通信,也有自己的架构.它的服务器端一般跑着像Openfire和ejabberd这样服务器

Asmack开发系列之XMPP概述

这一节,我们从Asmack基于的协议核心出发,XMPP协议,来学习.弄懂XMPP对学习Asmack源码有着重要的原因,做到知其然知其所以然. 本文主要是学习<XMPP The Definitive Guide Building Real-Time Applications with Jabber Technologies>文总结而来. 1,您能够拿XMPP来做什么? XMPP(Extensible Messaging and Presence Protocol),主要是传输XML数据. 典型的

Asmack开发系列之xmlPullParser

XMPP是用XML来进行数据交换的,所以,我们必须对XML有了解.对于XML理论知识,可以去稍微的复习一下.例如,节点,实体,属性等这些.今天,我们需要讲的是xmlPullParser.XML解析库其实有很多,而android平台下非常推崇它,当然XMPP也是,因为它的有点是不需要导入整个xml文件.还记得xmpp的一个特点就是能够传输小片xml文件数据.试想,如果你的xml解析库非得完整的xml文件,那么这和xmpp的设计思想是相冲突的. 这里,我给出一个使用xmlPullParser的例子,

iOS开发系列--通知与消息机制

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后面会补充通知中心的内容避免初学者对两种概念的混淆. 本地通知 推送通

iOS开发系列--并行开发其实很容易

概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程

iOS开发系列--通知与消息机制详解_IOS

概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地通知:另一类是推送通知,也叫远程通知.两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同.今天就和大家一块去看一下如何在iOS中实现这两种机制,并且在文章后面会补充通知中心的内容避免初学者对两种概念的混淆. 本地通知 本地通

【Qt编程】基于Qt的词典开发系列&amp;lt;二&amp;gt;--本地词典的设计

我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加入了c语言基本函数词典.下面介绍如何设计本地词典: 词典类型的选择         当然是txt格式的最好了,因为我们可以用程序直接进行读取.可是网上词典一般都是用mdx格式.ld2格式的,我无法用Qt来直接读取.最终,经过不断摸索,网上查找,发现我们可以将mdx格式的词典通过软件转化为txt格式的

手把手玩转win8开发系列课程(8)

这节,我们继续上节的一个议程. ①添加一个主页 现在我已经定义了一个ViewModel,我就开始整合项目.第一步就是添加主页到添加到项目中去.我明白项目为何吧页面创建为空白页面,但这个空白的页面起名字叫空白一点儿意义都没有吧,我这里需要给新页面起一个更有意义的页面.原先的空白页面,我已经吧他干掉了. 鄙人是个贱体,我更喜欢添加一些新的文件夹,使其更加的有层次.因此,我加了一个新的文件夹加做pages.在此文件夹下,我右击我添加了一个叫做list的xaml的文件. 特别提醒,如果你是xaml的一个

web标准实现高效开发系列之三

web|web标准 先点击这里下载Editplus CSS语法自动完成文件 先点击这里下载Editplus xHTML语法自动完成文件应版中朋友的要求我编写了一下xHtml的自动完成文件.下载后解压到EP的根目录下,然后在EP的首选项的语法中设定这个文件.然后用EP打开这个文件,看一下就清楚怎么用了. 举例:打一个"d"然后空格,然后EP就会把这个"d"变成<div></div> 先点击这里下载TopStyle 剪贴库文件 软件下载:TopS