XMPP协议中的Resource(同帐号多处登录依据)

      XMPP协议支持同一帐号在多处登录,并且支持对不同登录进行区分,这种区分通过绑定resourcepart实现。

      XMPP协议中用户帐号格式为<localpart@domainpart>,如<[email protected]>,类似于EMail地址,其中domainpart是服务器域名,localpart为帐号ID,所以,Client通过domainpart即可唯一的确定Server,而Server通过localpart可以唯一的确定Clinet所登录的帐号(并不是唯一的确定Client,因为XMPP支持一个帐号在多处同时登录)。

     那么,如何唯一的确定Client而不是Client对应帐号呢?XMPP协议中引入了resourcepart,当Client连接Server成功后,Client会绑定一个唯一的resourcepart,表示为<localpart@domainpart/resourcepart>。如此,服务器就可以唯一的定位到任意一个Client了。使用Openfire为服务器,会发现有个有趣的现象:帐号A在Client1和Client2上同时登录,由帐号B发送给帐号A消息,Client1和Client2会同时收到此消息,用Client1回复消息,B再发送消息给A,就只有Client1能收到了,再用Client2发送消息给B,B回复后,只有Client2能收到,Client1收不到。有了resourcepart之后,这一切变得很简单,也很容易理解。

     Resourcepart的生成有两种方式:1.Server收到Client的请求后生成;2.Client直接将resourcepart发送至Server。

     至于服务器是否一定要支持多用户同时登录,可根据实际需求确定,XMPP协议只是提供了一种支持,并不一定非这么做。如要禁止同帐号多处同时登录,可以在Client2认证请求的时候发送拒绝消息,或在close掉Client1的session。

     由于历史原因,XMPP之前叫Jabber,所以XMPP的帐号ID也被称为JabberID,简称JID。我们称<localpart@domainpart>为"bare JID"(裸JID),而称<localpart@domainpart/resourcepart>为"full JID"。

猜你喜欢

转载自thoughtbear.iteye.com/blog/1947492