JABBER USER RECEIVES: type=’result’ from=’jabberuser@host/work’ to=’jabberuser@host/work’/> jid=’contact@host’ subscription=’none’ name=’contact’/>
2、Jabber用户的客户端接着发送一个type=’subscribe’的的包给联系人: JABBER USER SENDS: to=’contact@host’ type=’subscribe’> I would like to add you to my roster.
3、Jabber用户客户端接着从服务器收到第二个包含联系人待定子状态的’none’订阅状态的“roster push”;这个待定子状态在其花名册条目中包含一个ask=’subscribe’属性: JABBER USER RECEIVES: jid=’contact@host’ subscription=’none’ name=’contact’ ask=’subscribe’/>
4、一旦Jabber用户客户端发送type=’subscribe’的包,该包被发送给联系人(我们假定该联系人在线): CONTACT RECEIVES: to=’contact@host’ type=’subscribe’ from=’jabberuser@host’> I would like to add you to my roster.
现在Jabber用户已经订阅了联系人。每个user.xml的花名册条目将如下所示: JABBER USER’S ROSTER: jid=’contact@host’ subscription=’to’ name=’contact’/> CONTACT’S ROSTER: jid=’jabberuser@host’ subscription=’from’/> (注意:如果在这里Jabber用户发送一个subscription请求给联系人,Jabber用户的Jabber服务器将“吞没”该请求,而不再将其发送给联系人。) 4、从一个联系人获取一个Subscription 如我们在前面所见,需要有一个Jabber用户和联系人之间的双向的subscription。在这个过程结束部分,我们将研究Jabber用户与联系人互相订阅的情况。 5、创建一个相互的Subscription 要建立一个相互的Subscription(如 a subscription=’both’),联系必须发送一个subscription请求给Jabber用户,并且Jabber用户必须接受该请求。让我们看看XML传回了什么,弄清楚其中发生了什么,以及每个人的花名册文件发生了什么变化。 1、 首先,联系人发送一个订阅请求给Jabber用户: CONTACT SENDS: I would like to add you to my roster.
此行为的一个结果是,联系人和Jabber用户的花名册文件的状态如下所示: CONTACT’S ROSTER: jid=’jabberuser@host’ subscription=’from’ name=’jabberuser’ ask=’subscribe’/> JABBER USER’S ROSTER: jid=’contact@host’ subscription=’to’ name=’contact’ subscribe=’I would like to add you to my roster.’/> 3、 一旦联系人客户端发送一个包含type=’subscribe’的包,该包将直接发送给Jabber用户(我们假定此时Jabber用户在线): JABBER USER RECEIVES: to=’jabberuser@host’ type=’subscribe’ from=’contact@host’> I would like to add you to my roster.
4、Jabber用户下一步要做的就是决定是否接受订阅请求。这里我们假定为”happy path”,即联系人接受订阅,这样Jabberyonghu的Jabber客户端: (1) 发送一个type=’subscribed’的的包给联系人 (2) 从服务器接收一个“roster push”包含联系人的条目,其中subscription状态置为“both”: JABBER USER SENDS: JABBER USER RECEIVES: jid=’contact@host’ subscription=’both’/>
8、客户端开发注意事项 从上面的论述中,必须要清楚,详尽的XML片断并不一定指得是同一个事物,也不一定拥有相同的含义——其含义根据实际情况中subscription的上下文以及花名册条目的状态决定。Jabber客户端的开发人员在写代码时,需要牢记这一点。一般来说,最好不要修改客户端一方关于花名册地描述,该花名册以你发送到服务器的外部XML为基础。在大多数情况下,你只需要等待“roster push”并使你的客户端根据其进行改变。 9、引用 本文引用了下列材料: l Jabber Programmers Guide(http://docs.jabber.org/jpg/) l Jabber Protocol Overview(http://docs.jabber.org/general/html/protocol.html) l Jabber protocol-Standard(http://docs.jabber.org/proto/) 注意 1、 如果联系人不在线,下列XML保存到联系人的花名册文件中: jid=’jabberuser@host’ subscription=’none’ subscribe=’I would like to add you to my roster.’/> 联系人下次登录时,服务器将提示’subscribe’属性,并产生一个来自Jabber用户的type=’subscribe’包,发送给联系人。 2、 如果联系人拒绝了订阅请求,联系人的客户端发送下列XML给Jabber用户: Jabber用户收到这个presence包,同时收到一个来自服务器的“roster push” to=’jabberuser@host’ type=’unsubscribed’ from=’contact@host’/> jid=’contact@host’ subscription=’none’ name=’contact’/>
这个操作后,Jabber用户和联系人的花名册状态如下: JABBER USER’S ROSTER: jid=’contact@host’ subscription=’none’ name=’contact’/> CONTACT’S ROSTER: no for Jabber User 你肯定想知道为什么对联系人的没有直接从Jabber用户的花名册中删除掉(那样返回的花名册我叫它“初始状态”),二是在花名册中保存了一个type为“none”的subscription。好问题,但我想说的时现有的Jabber系统机制是以这个方式运行的。(注意如果在这种状态Jabber用户向联系人发送一个订阅请求,其表现就联系人不在线的表现完全相同,Jabber用户客户端不必从服务器上获取初始的花名册是的这种情况除外。) 3、 如果Jabber用户在线,下面的XML保存仔Jabber用户的花名册文件中: jid=’contact@host’ subscription=’to’ subscribe=’I would like to add you to my roster.’/> 下次Jabber用户登录时,服务器注意到’subscribe’属性,然后生成一个从联系人到Jabber用户的的type=’subscribe’的包。 4、 如果Jabber用户拒绝订阅请求,Jabber用户的客户端发送下列XML给联系人: 联系人也将从服务器上收到一个“roster push”,改变Jabber用户的订阅状态为“from”: to=’contact@host’ type=’unsubscribed’ from=’jabberuser@host’/> jid=’jabberuser@host’ subscription=’from’ name=’jabberuser’/>