XMPP协议简介

简介:
可扩展消息和展示协议,以一种以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服务器。

  1. Client连接到XMPP Server
  2. server利用本地目录系统的证书对其进行认证。
  3. Client指定目标地址,让Server告知目标状态。
  4. Server查找目标Client,连接并进行相互认证。
  5. 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,可以取值为:

  1. get:获取当前域值
  2. set:设置或替换get查询的值
  3. result:说明成功的响应了先前的查询
  4. 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系统。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值