本文介绍在XMPP通讯中最核心的三个XML节(stanza).这些节(stanza)有本身的做用和目标,经过组织不一样的节(stanza),就能达到咱们各类各样的通讯目的。 服务器
首先咱们来看一段XMPP流。
<stream:stream>
<iq type='get'><query xmlns='jabber:iq:roster'/></iq>
<presence/>
<message to='william_duan@jabber.org' from='test_account@jabber.org' type='chat'><body>Hello</body></message>
<presence type='unavailable'/>
</stream:stream>
在上面的例子中,咱们能够看到一些XMPP节(stanza),包括<iq>,<message>以及<presence>。接下来就对这些节(stanza)作一个大体的了解。
节的共通属性ide
1.1 fromorm
表示节(stanza)的发送方,在发送节(stanza)时,通常来讲不推荐设定,服务器会自动设定正确的值,若是你设定了不正确的值,服务器将会拒收你的节(stanza)信息。xml
若是在客户端到服务器端的通讯中接收的节(stanza)中没有本属性,会被默认解释为信息是由服务器发出的。ip
若是在服务器到服务器的通讯中接收的节(stanza)中没有本属性,则会被解释为一个error.get
1.2 toit
表示节(stanza)的接收方。io
若是在客户端到服务器端的通讯中没有设置本属性,服务器会默认解释为信息是发给本身的。thread
1.3 typetest
指定节(stanza)的类型.每种节(stanza)都会有几种可能的设定值。
全部的节(stanza)都会有一个error类型,,代表这个节(stanza)是一个error回应,对这样的节(stanza)信息不须要进行回应。
1.4 id
表示一个特定的请求。在<iq>节中,这个属性是必需要指定的,可是在其余两个节(stanza)中是一个可选属性。
<presence>
presence节(stanza)用来控制和表示实体的在线状态,能够展现从离线到在线甚至于离开,不能打扰等复杂状态,另外,还能被用来创建和结束在线状态的订阅。
下面是一些节(stanza)的例子:
<presence/>
设定用户状态为在线
<presence type="unavailable"/>
设定用户状态为离线
<presence>
<show>away</show>
<status>at the ball</status>
</presence>
用于显示用户状态的详细信息。上面的例子代表用户由于at the ball在离开状态。
<show>标签在presence节点中最多出现一次,能够有如下取值:away,chat,dnd,xa.
away:离线
char:交谈中
dnd:但愿不被打扰
xa:离开一段时间
<status>标签用于显示额外信息
<presence>
<status>touring the countryside</status>
<priority>10</priority>
</presence>
在这个节中,出现了一个<priority>标签,表示如今链接的优先级。 每一个链接能够设置从-128到127的优先级,默认是设置为0。用户能够在这个标签里修改相应的优先级。若是有相应的设置的话,用户送往纯JID的将会送到优先级最高的那个链接,若是设置值为负数的话,则表示送往纯JID的消息将永远不会送达该链接。
扩展<presence>节点
1.在线状态预约(presence subscription)
首先咱们来看一个例子:
<presence
from="william_duan@jabber.org"
to="test_account@jabber.org"
type="subscribe"/>
<presence
from="test_account@jabber.org"
to="william_duan@jabber.org"
type="subscribed"/>
经过上述交互,william_duan就能看到test_account的在线状态,并能接收到test_account的在线状态通知了。
<message> 正如名字同样,message节(stanza)用于用户之间传递消息。这消息能够是单纯的聊天信息,也能够某种格式化的信息。 message节点信息是传递以后就被忘记的。当消息被送出以后,发送者是无论这个消息是 否已经送出或者何时被接收到。经过扩展协议,能够改变这样一种情况。
下面咱们看一些例子:
<message
from="william_duan@jabber.org"
to="test_account@jabber.org"
type="chat">
<body>Come on</body>
<thread>23sdfewtr234weasdf</thread>
</message>
私人聊天信息
<message
from="test_account@jabber.org"
to="william_duan@jabber.org"
type="groupchat">
<body>welcome</body>
</message>
多人聊天信息
上面的两个例子都包含了一个<type>标签,这个标签代表了消息的类型,能够取下面的一些值. chat:私人聊天信息,在IM中是最多见的。
error:错误信息
normal:不怎么使用的类型
groupchat:多人聊天信息
headline:一般用在自动服务中,不须要回应。
<body>标签里面是具体的消息内容。
<iq> iq节(stanza)主要是用于Info/Query模式的消息请求,他和Http协议比较类似。能够发出get以及set请求,就如同http中的GET以及POST. iq节点须要有回应,有get,set两种请求以及result,error两种回应。
下面咱们看看一些例子:
<iq
from="william_duan@jabber.org/study"
type="get"
id="roster1">
<query xmlns="jabber:iq:roster"/>
</iq>
william_duan请求本身的联系人列表。
<iq
to="william_duan@jabber.org/study"
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>
请求发生错误。
<iq
to="william_duan@jabber.org/study"
type="result"
id="roster1">
<query xmlns="jabber:iq:roster"/>
<item jid="account_one@jabber.org" name="one"/>
<item jid="account_two@jabber.org" name="two"/></iq> 请求成功,返回william_duan的联系人列表。每个<item>标签表明了一个联系人信息。