添加好友的流程,以及报文。
情况
1,A订阅B,B拒绝。结束
在此处,
如果B未处理。那么在A的列表会有B,但是subscription=none,B登录后列表没有A。
这种情况在spark中的显示是 “挂起”。
如果B没上线。等到B上线后,在登录过程中,对于收到的A加B的请求,B端的spark自动响应presence type=subscribed 同意A对B的好友申请,此时A(TO)B,B(FROM)A。然后B端sparn发送 presence type=subscribe请求加A为好友。 spark自动帮B同意了好友添加。。。
2,A订阅B,B同意,B再订阅A,A拒绝。
在此处,如果B再订阅A,A未进行处理,那么对A来说,就是A(to)B,对B来说,就是B(from)A。
3,A订阅B,B同意,B再订阅A,A同意。成功情况
注意
我仅讨论这三种情况,不包括其中的特殊情况比如B没上线,B未处理等。
发送remove有两种情况
1,收到unsubscribe,就发送remove。
2,主动删除对方发送remove
下面对三种情况的报文以及流程图
A 代表 clientA
B 代表 clientB
S 代表 Server
情况一 A订阅B,B拒绝,结束
A方界面
B方界面
A1, A->S 发送iq roster set将该人加到自己的好友列表
注,A1,A5节的顺序无所谓,先发iq roster set或者先发 presence type="subscribe"都可以
<iq id='setIQRoster_34616ce954390' type='set' xmlns='jabber:client'>
<query xmlns='jabber:iq:roster'>
<item jid='lxy4@user-20160421db' name='lxy4'>
<group>家人</group>
</item>
</query>
</iq>
A2, S->A 发送iq roster set将该人加到了他的列表。(我们在这个时候,将该人渲染到页面上)
<iq xmlns="jabber:client" type="set" id="325-544" to="lxy5@user-20160421db/6ws7h81i8t">
<query xmlns="jabber:iq:roster">
<item jid="lxy4@user-20160421db" name="lxy4" subscription="none">
<group>家人</group>
</item>
</query>
</iq>
A3, A->S 请求B的vcard。这个不在加好友的流程中,是我个人的设置,收到服务器发来的iq roster set,则渲染其到界面,并请求其vcard(主要是为了获得头像)
<iq id='vcard_34616ce98c911' type='get' from='lxy5@user-20160421db' to='lxy4@user-20160421db' xmlns='jabber:client'>
<vCard xmlns='vcard-temp'/>
</iq>
A4, A->S 发送 iq roster result,对A2节进行应答
<iq from='lxy5@user-20160421db/6ws7h81i8t' type='result' id='325-544' xmlns='jabber:client'/>
A5, S->A 收到服务器的 A1节的应答
<iq xmlns="jabber:client" type="result" id="setIQRoster_34616ce954390" to="lxy5@user-20160421db/6ws7h81i8t"/>
A6,A->S 发送 presence, type=subscribe请求订阅
<presence id='subscribe_34616ce9d8684' to='lxy4@user-20160421db' type='subscribe' from='lxy5@user-20160421db' xmlns='jabber:client'/>
A7, S->A 收到前面请求的vcard 。 这里就不整理了
<iq xmlns="jabber:client" type="result" id="vcard_34616ce98c911" from="lxy4@user-20160421db" to="lxy5@user-20160421db/6ws7h81i8t">
<vCard xmlns="vcard-temp">
<N><FAMILY/> <GIVEN/> <MIDDLE/> </N> <ORG><ORGNAME/> <ORGUNIT/> </ORG> <NICKNAME/> <FN/> <TITLE/> <URL/> <PHOTO><BINVAL>头像数据</BINVAL> <TYPE>image/jpeg</TYPE> </PHOTO> <EMAIL><HOME/><INTERNET/><PREF/><USERID/> </EMAIL> <TEL><VOICE/><WORK/><NUMBER/> </TEL> <TEL><PAGER/><WORK/><NUMBER/> </TEL> <TEL><FAX/><WORK/><NUMBER/> </TEL> <TEL><CELL/><WORK/><NUMBER/> </TEL> <TEL><VOICE/><HOME/><NUMBER/> </TEL> <TEL><PAGER/><HOME/><NUMBER/> </TEL> <TEL><FAX/><HOME/><NUMBER/> </TEL> <TEL><CELL/><HOME/><NUMBER/> </TEL> <ADR><WORK/><LOCALITY/> <CTRY/> <STREET/> <PCODE/> <REGION/> </ADR> <ADR><HOME/><LOCALITY/> <CTRY/> <STREET/> <PCODE/> <REGION/> </ADR>
</vCard>
</iq>
B1, S->B, B收到来自A的请求加好友
<presence xmlns="jabber:client" id="subscribe_34616ce9d8684" to="lxy4@user-20160421db" type="subscribe" from="lxy5@user-20160421db"/>
B2, B->S, B选择了拒绝
<presence id='unsubscribe_346177cde3578' to='lxy5@user-20160421db' type='unsubscribe' from='lxy4@user-20160421db' xmlns='jabber:client'/>
A8 , S->A , A收到了B不同意订阅的prensence节
<presence xmlns="jabber:client" id="unsubscribe_346177cde3578" to="lxy5@user-20160421db" type="unsubscribe" from="lxy4@user-20160421db"/>
A9, A->S, A发送remove节
(谁收到unsubscribe节,谁就发送remove)
<iq id='setIQRosterRemove_346177ce06187' type='set' xmlns='jabber:client'>
<query xmlns='jabber:iq:roster'>
<item jid='lxy4@user-20160421db' subscription='remove'>
<group>家人</group>
</item>
</query>
</iq>
A10, S->A , A收到服务器发来的remove节(此时才将B从界面上移除)
<iq xmlns="jabber:client" type="set" id="953-555" to="lxy5@user-20160421db/6ws7h81i8t">
<query xmlns="jabber:iq:roster">
<item jid="lxy4@user-20160421db" subscription="remove"/>
</query>
</iq>
A11, A->S , 对A10的确认
<iq from='lxy5@user-20160421db/6ws7h81i8t' type='result' id='953-555' xmlns='jabber:client'/>
A11, S->A ,对A9的确认
<iq xmlns="jabber:client" type="result" id="setIQRosterRemove_346177ce06187" to="lxy5@user-20160421db/6ws7h81i8t"/>
B3, S->B ,服务器给B发来的 iq roster remove
<iq xmlns="jabber:client" type="set" id="846-558" to="lxy4@user-20160421db/and4ahzwoc"><query xmlns="jabber:iq:roster"><item jid="lxy5@user-20160421db" subscription="remove"/></query></iq>
B4, B-S> B返回 对B3的确认
<iq from='lxy4@user-20160421db/and4ahzwoc' type='result' id='846-558' xmlns='jabber:client'/>
B5, S->B B收到了来自A的 unavailable 节
<presence xmlns="jabber:client" type="unavailable" from="lxy5@user-20160421db/Spark" to="lxy4@user-20160421db/and4ahzwoc"/>
流程图
有点长。。情况2,3放在另外篇章上,怕乱。