XMPP協(xié)議支持同一帳號在多處登錄晴圾,并且支持對不同登錄的區(qū)分晶疼,這種區(qū)分通過綁定resourcepart實現(xiàn)坟岔。
XMPP中用戶帳號格式為```“l(fā)ocalpart@domainpart”```渣触,如"<juliet@im.example.com>",類似于EMail地址河绽,其中domainpart是服務器域名芭概,localpart為帳號ID涕滋,所以病苗,Client通過domainpart即可唯一的確定Server疗垛,而Server通過localpart就可以唯一的確定Clinet所登錄的帳號(并不是唯一的確定Client,因為XMPP支持一個帳號在多處同時登錄)铅乡。
那么继谚,如何唯一的確定Client而不是Client對應帳號呢?XMPP協(xié)議中引入了resourcepart阵幸,當Client連接Server成功后,Client會綁定一個唯一的resourcepart芽世,表示為<localpart@domainpart/resourcepart>挚赊。如此,服務器就可以唯一的定位到任意一個Client了济瓢。使用Openfire為服務器荠割,會發(fā)現(xiàn)有個有趣的現(xiàn)象:帳號A在Client1和Client2上同時登錄,由帳號B發(fā)送給帳號A消息旺矾,Client1和Client2會同時收到此消息蔑鹦,用Client1回復消息,B再發(fā)送消息給A箕宙,就只有Client1能收到了嚎朽,再用Client2發(fā)送消息給B,B回復后柬帕,只有Client2能收到哟忍,Client1收不到。有了resourcepart之后陷寝,這一切變得很簡單锅很,也很容易理解。
resource part的生成有兩種方式:1.Server收到Client的請求后生成凤跑;2.Client直接將resourcepart發(fā)送至Server爆安。
至于服務器是否一定要支持多用戶同時登錄,可根據(jù)實際需求確定仔引,XMPP協(xié)議只是提供了一種支持扔仓,并不一定非這么做褐奥。如要禁止同帳號多處同時登錄,可以在Client2認證請求的時候發(fā)送拒絕消息当辐,或在close掉Client1的session抖僵。? ? 由于歷史原因,XMPP之前叫Jabber缘揪,所以XMPP的帳號ID也被稱為JabberID耍群,簡稱JID。我們稱“l(fā)ocalpart@domainpart”為"bare JID"(裸JID)找筝,而稱為"full JID"蹈垢。
http://thoughtbear.iteye.com/blog/1947492