Asmack开发系列之XMPP基础

简介:

今天,我们来说一下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)子节点。

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












相关文章
|
网络协议 算法 数据库
|
6月前
|
安全 Linux 数据安全/隐私保护
Red Hat Enterprise Linux 9.6 (x86_64, aarch64) - 红帽企业 Linux (RHEL)
Red Hat Enterprise Linux 9.6 (x86_64, aarch64) - 红帽企业 Linux (RHEL)
862 36
Red Hat Enterprise Linux 9.6 (x86_64, aarch64) - 红帽企业 Linux (RHEL)
如何使用命令生成RSA2密钥
说明:   本帖主要说明如何使用命令来生成RSA2密钥。    使用密钥工具生成RSA2密钥(推荐使用):    帖子地址:[url]https://openclub.alipay.com/read.
2098 12
|
Rust 前端开发 jenkins
Tauri 开发实践 — 使用 CI/CD 自动构建发布 Tauri 桌面端应用
本文介绍如何使用 CI/CD 自动构建发布 Tauri 应用。Tauri 是一个轻量级跨平台客户端框架,适合个人应用。文章首先概述了 CI/CD 的基本流程,并介绍了 GitHub Actions、GitLab CI 和 Jenkins 三种工具。最终选择了 GitHub Actions 进行配置。文中详细展示了使用 GitHub Actions 脚本实现 Tauri 应用构建的过程,并解决了权限和安全问题。项目源码可在 GitHub 上获取。
762 5
Tauri 开发实践 — 使用 CI/CD 自动构建发布 Tauri 桌面端应用
|
存储 人工智能 缓存
AI 提示词模板相关的架构设计
现在很多企业纷纷研发大语言模型以解决业务问题。提示词在与模型交互中起到关键作用。为优化提示词模板的修改、提高渲染效率及确保安全性,架构设计注重可修改性、安全性、可靠性和性能。设计包括:将提示词存储在OSS以方便修改和版本控制;使用本地缓存提升读取性能;模板引擎增强灵活性;秘钥安全存储在加密系统中;并通过配置中心动态调整。此设计旨在提供高效、安全且可靠的AI交互体验等。
1180 78
AI 提示词模板相关的架构设计
|
监控 Linux Perl
Linux 命令小技巧:显示文件指定行的内容
在 Linux 系统中,处理文本文件是一项常见任务。本文介绍了如何使用 head、tail、sed 和 awk 等命令快速显示文件中的指定行内容,帮助你高效处理文本文件。通过实际应用场景和案例分析,展示了这些命令在代码审查、日志分析和文本处理中的具体用途。同时,还提供了注意事项和技巧,帮助你更好地掌握这些命令。
1195 4
|
计算机视觉 Python
python 安装 cv2 - 已解决
python 安装 cv2 - 已解决
737 0
|
Java 数据库 开发者
深入解析 Spring Cloud Seata:分布式事务的全面指南
深入解析 Spring Cloud Seata:分布式事务的全面指南
643 1
|
SQL Java 数据库连接
IDEA开发插件有哪些值得推荐?
这篇文章介绍了IntelliJ IDEA中一些实用的神仙插件,包括RestfulTool(用于快速定位请求处理代码)、Translation(方便代码中的英文翻译)、Alibaba Java Coding Guidelines(遵循阿里巴巴编码规范)、Free MyBatis Tool(增强MyBatis支持)和Mybatis Log(整理SQL日志)。此外,还提到了Vue.js插件和可选装的Grep Console(日志高亮)、Maven Helper(解决Maven依赖冲突)以及Private Notes和Rainbow Brackets(代码注释和括号颜色标记)。
304 2
|
人工智能 JSON 数据格式
[AI CrewAI] 你来当老板,组建AI团队,协作AI Agent完成任务
[AI CrewAI] 你来当老板,组建AI团队,协作AI Agent完成任务