核心XMPP工具集由三个基本节组成,分别为
XMPP流由两份XML文档组成,通讯的每一个方向均有一个文档,这些文档有一个根元素
<stream:stream> <iq type=’get’> <query xmlns=’jabber:iq:roster’ /> //请求本身的花名册 </iq> <presence/> //通知服务器她已在线并能够访问 <message to=’darcy@pemberley.lit’ from=’elizabaeth@longbourn.lit/ballroom’ type=’chat’> <body> I cannot talk of books in a ball-room; my head is always full of something else. </body> //发送消息 </message> <presence type=’unavailable’> // 声明本身不可访问并关闭 </stream:stream>
from/to/type/id网络
from的属性并不是由客户端提供,而是服务端进行的标记。session
presence提供网络实体的可访问性。用户发出presence节,代表本身上线,这样能够会有更大的几率与别人通讯(人们更愿意与在线的人交流),可是咱们也不用担忧任何人均可以看到本身的在线状态,除非咱们订阅了该用户的状态,订阅以后,用户的状态信息会自动发送到订阅者处。工具
实际上,XMPP的presence节是一个简单的专用的发布-订阅方法。code
在IM中,presence体如今花名册(roster)中,花名册保存有JID列表以及用户与这些JID的订阅关系,一旦上线,用户发送presence节,剩下的就由服务器处理了(通知本身在线,以及获取联系人的状态信息)orm
当有客户端的状态更新时都会给服务器发送presence消息,从而触发PresenceUpdateHandler中的process方法,此方法首先判断presence包中的type,分为如下几种方案:xml
用于从一个实体向另一个实体发送消息,并能够传输任何类型的结构化信息,不保证传输可靠性路由
message是一个很是基础的推模型,message一般用于IM,groupchat,警告和通知等。文档
message的type有以下几种:
相似于email,发出后不等待回应
用于两个实体间的实时通讯
多用户聊天室中使用
用于发送警告或通知
发送错误信息
结构以下:
<message from=madhatter@wonderland.lit/foo to=alice@wonderland.lit type="chat"> <body>Who are you?</body> <subject>Query</subject> </message>
除了type以外,典型的message节中还包含from、to或者id属性(用于目的追踪)。
to中的JID为消息的接受者,from是发送者的JID,可是from属性并不是由客户端提供,而是发送者的服务端提供的,以免地址模仿。
message节中也能够包含未在XMPP协议中定义的负载,能够用于扩展。
<iq from='jane@longbourn.lit/garden' type='get' id='roster1'> <query xmlns='jabber:iq:roster'/> </iq>
<iq to='jane@longbourn.lit/garden' type='error' id='roster1'> <query xmlns='jabber:iq:roster'/> <error type='cancel'> <feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/> </error> </iq>
Jane 向她的服务器发送了一个格式错误的花名册请求。服务器使用一个错误提示节做为响应
<iq from='jane@longbourn.lit/garden' type='get' id='roster2'> <query xmlns='jabber:iq:roster'/> </iq>
<iq to='jane@longbourn.lit/garden' type='result' id='roster2'> <query xmlns='jabber:iq:roster'> <item jid='elizabeth@longbourn.lit' name='Elizabeth'/> <item jid='bingley@netherfield.lit' name='Bingley'/> </query> </iq>
在从新发送正确的请求以后,服务器将Jane 的简短花名册响应给她。能够看到Elizabeth 和 Bingley 均在Jane 的联系人列表中。
<iq from='jane@longbourn.lit/garden' type='set' id='roster3'> <query xmlns='jabber:iq:roster'> <item jid='darcy@pemberley.lit' name='Mr. Darcy'/> </query> </iq>
<iq to='jane@longbourn.lit/garden' type='result' id='roster3'/>
Jane 试图将Darcy 添加到本身的花名册中,服务器用一个空白IQ-result 节来指出添加成功。 若是应答节只是成功确认,那么IQ-result 节一般是空白的。 在任何须要结果数据或者须要简单确认的场合中,