Asmack开发系列之XMPP基础

本文涉及的产品
.cn 域名,1个 12个月
简介:

今天,我们来说一下XMPP协议本身的一些东西。毕竟Asmack只是该协议的一个实现版本。所以,我们又必要了解XMPP协议本身。

1,架构

什么是架构,架构就是一系列实体如何组织、联系和交换信息。例如万维网,由成千上万的服务器,他们运行着Apache或者是新的Nginx,客户端由web浏览器,如IE,firefox和Chrome。他们之间交换的数据是HTML,他们之间交换数据的协议是HTTP。

类似的,对于即时通信,也有自己的架构。它的服务器端一般跑着像Openfire和ejabberd这样服务器软件,客户端一般有像Adium,Gajim,Pidgin等。XMPP是协议,但为了描述方便,我也会那它当做是我们整个这类软件,架构的代名词。xmpp是decentralized client-server architecture,去中心化的客户端-服务器架构。怎么理解?就是它有服务器,不是纯种的peer-to-peer那种架构,这样管理方便,更可靠。但它的服务器不是一个,不是单点,而是散耦合的,这样就鲁棒。这也就得支持服务器到服务器的通信。


但是,xmpp和www是有区别的,万维网的服务器是不会为你转发信息的,它很少支持域间通信。这么说吧,加入你访问的了迅雷的一个网页,但是这个网页有一个URL图片是指向优酷的,这个时候你的Chrome访问迅雷后,还得它自己去访问优酷来下载这个图片,迅雷是不会为你下的然后传给你。万维网的示意如下:


在服务器传递消息这方面,我们需要再说一下邮件系统,如下图所示。邮件系统是多步转发的。假如你用QQ邮箱给我的工作邮箱zengjinlong@xunlei.com发送一个邮件,首先你的邮箱客户端会把你的邮件上传到QQ邮箱,QQ邮箱就检索,看是不是能够直接投递给迅雷邮箱服务器,假如哈,假如没检索到,于是腾讯就把邮件转给了它觉得应该正确的下一步,比如说百度,百度邮箱收到之后一看,迅雷的邮件,有,于是直接转给迅雷邮箱服务器。迅雷邮箱服务器收到之后帮你存储,然后当你要的时候就推送给你。


xmpp呢,支持域间(服务器之间)通信,但是没有邮件系统那么复杂,它只支持单步转发。就好比刚才的邮件,如果腾讯没有找到迅雷,他就不会说再投给百度试一下,不会的。它会选择回复你一个不可达或者直接抛弃。如下图所示


总结一下万维网,邮件系统,xmpp系统的区别


2,地址

因为xmpp是一个网络协议,包含客户端和服务器,需要在网络上传输数据。所以,他们需要一个地址。xmpp并不是直接建立在IP上,它依赖DNS(domain Name System)(事实上其实没有域名也是可以的,至少我的系统没有域名,但是你需要指定host(IP)和一个假定的域名(虚拟的,随便填,但你要记得他))。xmpp的账号都是这样子的eg:micall@xunlei.com,后面跟的是完整的域名。这个和传统IM不太一样。对了,这个唯一标示用户的叫做JabberID(JID)。

一个JID包含三部分内容:

1)用户名。

2)域名。

3)资源(Resources)。资源是xmpp支持一个账号多终端登入的必要条件。还是这个账号micall@xunlei.com,加入你在PC上登入,那么一个完整的用户名就是micall@xunlei/PC,加入你在你的android手机登入,micall@xunlei.com/android,你在你的ipad登入,那么micall@xunlei/ipad。等等,这样的机制是为了支持多终端登入,而且可以设定他们接收数据的优先级。

3,XML流

XMPP,本质上就是一种传输XML流的技术。和HTTP不一样,HTTP是每次请求完之后,连接就断开,然后要新开连接,HTTP的一些其他技术都导致它不够实时。不能够满足一些例如即时通信的场合。xmpp不一样,你可以发送多个请求,它也不会阻塞住,xmpp需要注意的是你需要用异步的思维来考虑事情。后续章节会知道。在这里我给大家贴一个xml会话。

C: <stream:stream>
C: <presence/>
C: <iq type="get">
<query xmlns="jabber:iq:roster"/>
</iq>
S: <iq type="result">
<query xmlns="jabber:iq:roster">
<item jid="alice@wonderland.lit"/>
<item jid="madhatter@wonderland.lit"/>
<item jid="whiterabbit@wonderland.lit"/>
</query>
</iq>
C: <message from="queen@wonderland.lit" 
to="madhatter@wonderland.lit">
<body>Off with his head!</body>
</message>
S: <message from="king@wonderland.lit"
to="party@conference.wonderland.lit">
<body>You are all pardoned.</body>
</message>
C: <presence type="unavailable"/>
C: </stream:stream>

4,通信洪流(Communication Primitives)

对于这个标题,我暂且这么翻译吧,请不要吐槽,如果你有更好的名字,请留言,我将不客气的更新这个名字。在xmpp中还有个字眼“stanzas"是非常常见的,翻译为”局“?”节“?。我把它翻译为”节“。它是个什么概念呢,其实,你可以理解为packet。就是一次传输的数据包。

节的意义需要从以下几个方面来确定:

(1)节元素的名称,例如message,presence,iq等。这几个不同的节,服务器对它的处理时不一样的,客户端对他们的处理也是不一样的。

(2)Type属性。

(3)子节点。

下一节,我们详细说明有哪些节以及他们的处理。












相关文章
|
XML API 数据安全/隐私保护
|
Web App开发 JavaScript API
跨平台的WebRTC客户端框架:OpenWebRTC
Webrtc的ios框架编译 http://www.th7.cn/Program/IOS/201502/390418.shtml     WebRTC in WebKit : http://www.
2799 0
|
XML 数据格式
XMPP学习——3、XMPP协议学习补充
流基础 两个基本概念,使得XMPP实体之间的小的结构化信息有效载荷能快速地进行异步交换:XML流和XML节。这些术语的定义如下。 XML流的定义: XML流是一个容器,用于任何两个实体通过网络进行XML元素的交换. XML流的开始明确表达为一个打开的 "流头" (即, 一个包含了适当树形和命名空间声明的 XML &lt;stream&gt; 标签), 而这个XML流
1254 0
【Win10应用开发】协议-下篇:自定义多个协议
原文:【Win10应用开发】协议-下篇:自定义多个协议 前面介绍了如何为应用程序自定义协议,于是有朋友会问,我希望为我的应用注册多个协议,不同的协议处理不同的事情,能吗?答案是能的。 方法主要在配置清单文件上,这里我给出一个例子,示例应用将注册两个协议,分别为music:和video:。
954 0
|
数据安全/隐私保护 安全 开发者
XMPP客户端库Smack 4.0.6版开发之三
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/41594855 XMPP客户端库Smack 4.0.6版开发之三 作者:chszs,转载需注明。
751 0
XMPP客户端库Smack 4.0.6版开发之五
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/41620843 XMPP客户端库Smack 4.0.6版开发之五 作者:chszs,转载需注明。
688 0
|
数据安全/隐私保护 安全
XMPP客户端库Smack 4.0.6版开发之四
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/41620825 XMPP客户端库Smack 4.0.6版开发之四 作者:chszs,转载需注明。
891 0