码迷,mamicode.com
首页 > 其他好文 > 详细

XMPP协议的工作原理

时间:2015-06-04 19:26:51      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:xmpp   聊天   通信   即时通信   xml   

XMPP地址格式

一个实体在XMPP网络结构中被称为一个接点,它有唯一的标示符jabber identifier(JID),即实体地址,用来表示一个Jabber用户,但是也可以表示其他内容,例如一个聊天室.一个有效的JID包括一系列元素:(1)域名(domain identifier);(2)节点(node identifier);(3)源(resource identifier).它的格式是node@domain/resourcenode@domain,类似电子邮件的地址格式.domain用来表示接点不同的设备或位置,这个是可选的,例如a在Server1上注册了一个用户,用户名为doom,那么a的JID就是doom@serverl,在发送消息时,指明doom@serverl就可以了,resource可以不用指定,但a在登录到这个Server时,fl的JID可能是doom@serverl、exodus(如果a用Exodus软件登录),也可能是doom@serverl/psi(如果a用psi软件登录).资源只用来识别属于用户的位置或设备等,一个用户可以同时以多种资源与同一个XMPP服务器连接

 

XMPP消息格式
XMPP中定义了       3个顶层XML元素: Message、Presence、IQ,下面针对这三种元素进行介绍。

 

<Message>

用于在两个jabber用户之间发送信息。Jsm(jabber会话管理器)负责满足所有的消息,不管目标用户的状态如何。如果用户在线jsm立即提交;否则jsm就存储。

To :标识消息的接收方。

from : 指发送方的名字或标示(id)o

Text: 此元素包含了要提交给目标用户的信息。

结构如下所示:

 

<message to= ‘lily@jabber.org/contact’ type =’chat’>

<body> 你好,在忙吗</body>

</message>

 

 <Presence>

用来表明用户的状态,如:online、away、dnd(请勿打扰)等。当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态.结构如下所示:

<presence>

From =‘lily @ jabber.com/contact’

To = ‘yaoman @ jabber.com/contact‘

<status> Online </status>

</presence>

<presence>元素可以取下面几种值:

Probe :用于向接受消息方法发送特殊的请求

subscribe:当接受方状态改变时,自动向发送方发送presence信息。

 

 

< IQ >

一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应.例如,client在stream的上下文中插入一个元素,向Server请求得到自己的好友列表,Server返回一个,里面是请求的结果.

<iq > 主要的属性是type。包括:

Get :获取当前域值。

Set :设置或替换get查询的值。

Result :说明成功的响应了先前的查询。

Error: 查询和响应中出现的错误。

结构如下所示:

<iq from =‘lily @ jabber.com/contact’id=’1364564666’ Type=’result’>


XMPP工作机制:


  例如:一个终端名字是Remeo,通过服务器montague.lit与其他的用户相连,其他的用户

通过服务器juliet@capulet.lit建立连接。

第一步Romeo开始通过发送一个stream包与服务器montague.lit取得联系,这一步包含了鉴权,登录等等。

第二步Romeo获取了他的联系人列表,通过向服务器montague.lit发送<iq/>字段请求,按照下面的协议。

<iq type=‘get’from=‘romeo@montague.lit/pda’>

<query xmlns=‘jabber:iq:roster’/>

</iq>

<iq type=‘result’to=‘romeo@montague.lit/pda’>

<query xmlns=‘jabber:iq:roster’>

<item jid=‘juliet@capulet.lit’/><item jid=‘mercutio@shakespeare.lit’/>

<item jid=‘benvolio@shakespeare.lit’/>

</query>

</iq>

第三步Romeo发送了一个presence请求到服务器montague.lit,然后会将这个信息广播到他的所有好友。

<presence from=‘romeo@montague.lit/pda’/>

<presence from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’/>

<presence from=‘romeo@montague.lit/pda’to=‘mercutio@shakespeare.lit’

/>

<presence from=‘romeo@montague.lit/pda’to=‘benvolio@shakespeare.lit’

/>

第四步如果Romeo的联系人都在线,就会将presence回复给Romeo,告知自己的状态。

<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/balcony’/>

<presence to=‘romeo@montague.lit/pda’from=‘juliet@capulet.lit/chamber’/>

<presence to=‘romeo@montague.lit/pda’from=‘mercutio@shakespeare.lit/home’/>

第五步RomeoJuliet开始交换信息,进行聊天。

<message from=‘romeo@montague.lit/pda’to=‘juliet@capulet.lit’>

<body>hi!</body>

</message>

<message from=‘juliet@capulet.lit/balcony’to=‘romeo@montague.lit/pda’

<body>hi yourself!</body>

</message>

 

以文档的观点来看,客户端或服务器发送的所有XML文本连缀在一起,从<stream></stream>构成了一个完整的XML文档。其中的stream标签就是所谓的XML Stream。在<stream></stream>中间的那些<message>...</message>这样的XML元素就是所谓的XML StanzaXML节)。XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。但是这个过程并不是一问一答的,任何时候都有可能从一个方发信给另外一方。通信的最后阶段是</stream>关闭流,关闭TCP/IP连接。



所以这种方式和传统的http不一样了!

传统的http是请求之后,去服务器回去数据

而xmpp是,服务器给客户端数据!

XMPP协议的工作原理

标签:xmpp   聊天   通信   即时通信   xml   

原文地址:http://blog.csdn.net/nyist327/article/details/46365415

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!