Skip to content

Commit 9977532

Browse files
committed
no message
1 parent d89f97f commit 9977532

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

6-理解xmpproster的subscription.md

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# 理解XMPPRoster的subscription
2+
3+
要理解XMPPRoster, 首先, 必须要理解 subscription 这个概念, 先看一下 [RFC3921](http://wiki.jabbercn.org/RFC3921)中关于 subscription 的定义:
4+
5+
一个名册条目相关的出席信息订阅的状态从<item/>元素的'subscription'属性可以得到.这个属性允许的值包括:
6+
7+
"none" -- 这个用户没有对这个联系人出席信息的订阅, 这个联系人也没有订阅用户的出席信息
8+
"to" -- 这个用户订阅了这个联系人的出席信息, 但是这个联系人没有订阅用户的出席信息
9+
"from" -- 这个联系人订阅了用户的出席信息, 但是这个用户没有订阅这个联系人的出席信息
10+
"both" -- 用户和联系人互相订阅了对方的出席信息
11+
12+
四个状态可以互相转换, 下面看一下它们之间是如何转换的.
13+
14+
1. 假设登录用户(zhangsan)已经有一个好友(lisi), 获取好友列表时, 返回的好友列表的报文如下, subscription 的状态为 both
15+
16+
<iq type="result" id="5nKV7-6" to="[email protected]/mobile">
17+
<query xmlns="jabber:iq:roster">
18+
<item jid="[email protected]" name="李四" subscription="both">
19+
<group>Friends</group>
20+
</item>
21+
</query>
22+
</iq>
23+
24+
2. zhangsan 申请添加用户 wangwu 为好友, 发送好友请求后(**添加好友**操作将会在下一节进行介绍),登录用户(zhangsan)的好友列表报文如下:
25+
26+
其中:<br/>
27+
name 为昵称,在添加好友时可以设定<br/>
28+
group为好友所在的分组<br/>
29+
ask 节点为 subscribe,表示正在等待对方接受好友请求<br/>
30+
subscription 为 none,表示暂时双方都还不是好友
31+
32+
<iq type="result" id="5nKV7-6" to="[email protected]/mobile">
33+
<query xmlns="jabber:iq:roster">
34+
<item jid="[email protected]" name="李四" subscription="both">
35+
<group>Friends</group>
36+
</item>
37+
<item jid="[email protected]" name="王五" ask="subscribe" subscription="none">
38+
<group>Friends</group>
39+
</item>
40+
</query>
41+
</iq>
42+
43+
3. wangwu 收到 zhangsan 发过来的好友请求,同意好友申请(发送一个同意的报文到服务器),同时,wangwu会再发送一个**申请添加 zhangsan为好友的请求到服务器**
44+
45+
这个时候,wangwu 的好友列表报文如下,其中 subscription 为 from,表示 wangwu 是 zhangsan 的好友,但 zhangsan 并不是 wangwu 的好友(用微博的表达来说就是:zhangsan 关注了 wangwu,但是 wangwu 并不一定需要关注 zhangsan )
46+
47+
<iq type="result" id="5nKV7-6" to="[email protected]/mobile">
48+
<query xmlns="jabber:iq:roster">
49+
<item jid="[email protected]" name="张三" ask="subscribe" subscription="from">
50+
<group>Friends</group>
51+
</item>
52+
</query>
53+
</iq>
54+
55+
4. zhangsan 收到 wangwu “同意zhangsan的好友请求” 后,roster列表中,wangwu的subscription变为 to
56+
57+
<iq type="result" id="5nKV7-6" to="[email protected]/mobile">
58+
<query xmlns="jabber:iq:roster">
59+
<item jid="[email protected]" name="李四" subscription="both">
60+
<group>Friends</group>
61+
</item>
62+
<item jid="[email protected]" name="王五" subscription="to">
63+
<group>Friends</group>
64+
</item>
65+
</query>
66+
</iq>
67+
68+
5. 同时,zhangsan收到了 wangwu 也想添加 zhangsan为好友的请求,zhangsan发送了一个 “同意好友申请” 到服务器,此时,wangwu 的 subscription 变为了 both,好友列表如下:
69+
70+
<iq type="result" id="5nKV7-6" to="[email protected]/mobile">
71+
<query xmlns="jabber:iq:roster">
72+
<item jid="[email protected]" name="李四" subscription="both">
73+
<group>Friends</group>
74+
</item>
75+
<item jid="[email protected]" name="王五" subscription="to">
76+
<group>Friends</group>
77+
</item>
78+
</query>
79+
</iq>
80+
81+
82+
因此,整个流程可以理解为:
83+
84+
1. A 申请 添加 B 为好友
85+
2. B 同意 A 的好友申请,A-->B (A to B, B from A)
86+
3. B 申请添加A为好友
87+
4. A 同意 B的好友申请 A <--> B (A both B,B both A)
88+
89+
四个步骤都完成了,表示A 与 B互为好友了。
90+
91+
这里理解起来有点困难,咱们再用 twitter的 “关注” 这个概念来理解一下(假设A关注B,是需要B同意了才能关注)
92+
93+
1. A 想关注B,然后发送申请给B
94+
2. B 收到了申请,然后同意 A关注自己, 状态就变成了:(A --> B)
95+
3. 同时,B 也想关注A,然后发送申请给A (当然B也可以选择不关注A)
96+
4. A 收到B的申请, 同意B关注自己,状态就变成了 (A <--> B),A与B互相关注了。

0 commit comments

Comments
 (0)