简介:
可扩展消息和展示协议,以一种以xml为基础的开放式实时通信协议,也是目前主流的四种IM协议之一。它将需要实时通信的消息嵌入到xml结构体中,不仅具有很好的可扩展性,还拥有较强的可读性。简单的说,就是一个拥有良好扩展性的发送接收处理消息的协议。在XMPP协议中定义了三种角色:客户端、服务端、网关,通信能够在这三者之间的任意两者之间双向完成。服务器端同时承担了客户端信息记录,连接管理和路由功能。网关承担着与异构及时通信系统的互联互通。异构系统可以包括SMS,MSN等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后再之上传输XML。XMPP的核心XML流传输协议的定义使得XMPP比以往的网络通讯协议更加规范,同时受益于XML的特点使得XMPP协议便于解析和阅读。另外XMPP本身不支持二进制传输,意味着音频、视频无法在XMPP上运用,但是借助XMPP的扩展协议Jingle则可以支持音频、视频。XMPP的官方核心文档是RFC 3920.
优点:
开放性
标准性
可扩展
跨平台
缺点:
数据冗余(xml结构本身特性决定的),移动端损耗流量
不支持二进制数据,也就限定了只能传输文本数据
工作流程:
任何一个从Client到Client的消息和数据都需要通过XMPP服务器。
- Client连接到XMPP Server
- server利用本地目录系统的证书对其进行认证。
- Client指定目标地址,让Server告知目标状态。
- Server查找目标Client,连接并进行相互认证。
- Client间进行交互。
XMPP地址格式
一个实体在XMPP网络结构中被称为一个节点,它有唯一的标识符(JID)——实体地址。
JID=[node”@”]domain[“/”resource]
比如:dong@weizhi.org/res
node:用户名
domain:服务器域名
resource:用来识别属于用户的位置或设备,比如dong@weizhi.org/pq,表示dong用户使用pq软件,dong@weizhi.org/sm,则表示用户dong使用sm软件。这意味着一个用户可以同时以多种资源与同一个XMPP服务器进行连接。
XMPP消息格式:
xmpp中定义了3个顶层的元素:presence、iq,message。如下:
<stream>
<presence>
<status>...</status>
</presence>
<message>
<body>...</body>
</message>
<iq>
<type>...</type>
</iq>
</stream>
1、Message用来在两个用户之间发送消息。会话管理器(JSM)负责满足所有的消息传递,无论用户状态如何。如果用户在线,则立即提交,否则会话管理器就存储该消息。举例:
<message
from=dong@weizhi.org/contact
to=li@weizhi.org/contact
type="chat">
<body>你在干什么?</body>
</message>
from:消息发送方
to:消息接受方
text:提交给目标用户的文本消息
2、presence用来描述用户的状态,比如online表示在线,dnd表示请勿打扰等等。一旦用户改变自己的状态是,就会在stream的上下文中插入该元素来表明自己状态。举例:
<presence
from=dong@weizhi.org/contact
to=dong@weizhi.org/contact>
<status>online</status>
</presence>
3、iq代表一种一种请求/响应机制,从一个实体发送请求,另一个实体接受请求并进行响应。其主要属性是type,可以取值为:
- get:获取当前域值
- set:设置或替换get查询的值
- result:说明成功的响应了先前的查询
error:查询和响应中出现的错误
举例:
<iq from=dong@weizhi.org/contact id=1223456789 type="result"> </iq>
完整的XML流实例:
1、客户端
<?xml version="1.0" ?>
<stream:stream
to="weizhi.org"
xmlns="jabber:client"
xmlns:stream="http_etherx_jabber_org/streams"
version="1.0"
>
2、服务端
<?xml version="1.0" ?>
<stream:stream
from="weizhi.org"
id=123456789
xmlns="jabber:client"
xmlns:stream="http_etherx_jabber_org/streams"
version="1.0"
>
3、客户端
<message
from="example_com"
to="example_net"
xml:lang="zh-cn">
<body>...</body>
</messaage>
4、服务器
<message
from=""
to=""
xml:lang="cn">
<body>...</body>
</message>
5、客户端
</stream:stream>
6、服务器
</stream:stream>
客户端和服务器发送的所有XML文本连接在,从到,最终形成完成XML文档。其中是stream标签就是XML Stream。而在与中间的xml元素则是XML Stanza。 XMPP核心通信基本模式就是先建立了一个stream,然后协商一堆安全的东西,中间通信的过程就是客户端发送XML Stanza。服务端更具客户端发送的信息以及程序逻辑,发送相应的Stream Stanza给客户端。注意这个过程并不是一问一答的,任何时候都有可能从一方发送消息给另一方。通信的最后阶段是以关闭XML流,进而关闭TCP/IP连接。
扩展:
1、openfire
采用java开发,基于XMPP协议开源的实时协作(RTC)服务器。
2、Spark
提供了一个基于XMPP客户端的实现。
3、smack
smack是一个XMPP协议的实现,采用java编写,是spark的核心。
缺点:api不适合大量并发情况下使用,每个客户需要1个线程,占用资源大。
优点:不需要熟悉xmpp协议格式,使用简单。
4、IM系统
Instant Messager ,及时通信软件,例如QQ等。利用Openfire做服务端,Spark做客户端,Smack做XMPP协议的实现,即可构建最简单的IM系统。