2

当我从服务器上的花名册中手动删除联系人时,服务器发送给我的内容如下(openfire):

'<iq type="set" id="183-87" to="foo@edmund.local/hydra"><query xmlns="jabber:iq:roster"><item jid="bar@yahoo.edmund.local" name="baz" ask="unsubscribe" subscription="none"><group>Buddies</group></item></query></iq>'
'<iq type="set" id="187-88" to="foo@edmund.local/hydra"><query xmlns="jabber:iq:roster"><item jid="bar@yahoo.edmund.local" name="baz" subscription="none"><group>Buddies</group></item></query></iq>'
'<presence type="unsubscribed" to="foo@edmund.local" from="bar@yahoo.edmund.local"/>'

如果我回复一个“取消订阅”状态节(根据 RFC 3921,我认为这是正确的),服务器会继续向我发送更多“未订阅”状态的垃圾邮件。

无论哪种方式,下次我的客户登录时,名册中都没有任何变化。难道我做错了什么?

4

2 回答 2

5

这取决于您在谈论哪个客户 - 是订阅者还是订阅者。

.

如果客户端是订阅者,那么什么都没有:

根据第 9.4 节,如果订阅者发送unsubscribe请求,或者其他原因导致客户端被取消订阅,服务器必须确认请求/报告状态更改并做出unsubscribed响应。互动到此结束。

unsubscribe如果订阅者每次收到来自服务器的状态通知时发送另一个请求unsubscribed,告诉它先前的订阅已被删除,那么它永远不会结束。

.

如果客户端是订阅节点,则可能会发送一个unsubscribe确认允许删除订阅,但是当您在正常机制之外更改名册时,这是否仍然有效,我不确定。

我对 9.4 中表格的阅读是针对取消订阅期间订阅者和服务器之间的消息:

subscriber            server             subscribee
    | -- unsubscribe --> |                    |
    |                    | -- unsubscribe --> |
    |                    | <- unsubscribed -- | (optional)
    |                    | -- unsubscribed -> |
    | <- unsubscribed -- |                    |

我对第 8.6 节的阅读,名册删除是这样的:

subscriber            server             subscribee
    | ----- remove ----> |                    |
    |                    | -- unsubscribe --> |
    |                    | -- unsubscribed -> |
    |                    | -- unavailable --> |
    | <- unsubscribed -- |                    |
    | <-- unavailable -- |                    |

任何一个客户都不需要确认。

于 2009-03-03T10:58:30.757 回答
1

我太生疏了,无法直接回答您,但是由于已经有几个小时没有答案了,所以让我提个建议...

加载 pidgin 或其他可以记录 xmlstream 的客户端,从该客户端发送取消订阅,然后复制您在日志中看到的代码。

这将帮助您获得正确的节,或者它将识别 openfire 中的不兼容(不太可能,但谁知道)。

于 2009-03-03T08:58:46.677 回答