RFC6121-IM-01管理名册订阅02添加好友报文流程图1

本文详细介绍了基于XMPP协议的即时通讯软件中好友添加流程的三种常见情况及其交互报文,包括发起请求、同意、拒绝等操作的实现细节。

添加好友的流程,以及报文。


情况

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放在另外篇章上,怕乱。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值