服务发现
XMPP实体种类多样,支持功能复杂,项目版本更新迅速,以至于衍生了两个问题:
1 如何获知网络包含的实体
2 实体支持何种XMPP协议功能
使用服务发现(disco)将解决上述问题
服务发现方法
1 disco#items 发现网络中实体
2 disco#info 发现一个实体支持的功能
disco#items示例
通过disco#items请求发现ejabberd.org服务器实体
<iq from="user@ejabberd.org"
id="xl391n47"
to="ejabberd.org"
type="get">
<query xmlns="http://jabber.org/protocol/disco#items"/>
</iq>
服务器回复一个相关的实体名单,其中客户端由 id 属性的值跟踪
<iq from="ejabberd.org"
id="xl391n47"
to="user@ejabberd.org"
type="result">
<query xmlns="http://jabber.org/protocol/disco#items">
<item jid="conference.ejabberd.org"/>
<item jid="proxys.ejabberd.org"/>
</query>
</iq>
disco#info示例
获取网络实体后,通过disco#info查看实体支持功能
<iq from="user@ejabber.org"
id="gq02kb71"
to="conference.ejabberd.org"
type="get">
<query xmlns="http://jabber.org/protocol/disco#info"/>
</iq>
conference.ejabberd.org服务返回一些关于自身的信息
<iq from="conference.ejabberd.org"
id="gq02kb71"
to="user@ejabberd.org"
type="result">
<query xmlns="http://jabber.org/protocol/disco#info">
<identity category="conference" type="text" name="公共房间"/>
<feature var="http://jabber.org/protocol/muc"/>
<feature var="jabber:iq:register"/>
<feature var="vcard-temp"/>
</query>
</iq>
由XML应答信息,可知,conference.ejabberd.org提供主机服务,文本会议服务,支持多用户聊天协议,内置用户名注册和电子名片组件
注:<identity/>元素是实体“代理信息”,不透露详细功能,但是可以宣扬身份
服务发现方式
使用服务器和服务进行服务发现
disco#items 和 disco#info 的方法通常是一起使用,以实现实体的“走遍树”。
1 disco#items向A发送IQ-GET发现实体B
2 disco#info发现实体B功能协议
3 disco#items向B发送IQ-GET发现提示C
4 disco#info发现实体C功能协议
5 disco#items向C发送IQ-GET发现实体D
6 …
使用客户进行服务发现
客户至少知道一个实体,也就是自己的服务器,同时若客户存在联系人名册,可利用出席信息获取联系人全JID,针对JID使用disco#info即可