XMPP:原始请求者离线时建立相互订阅的RFC(订阅状态)

时间:2011-01-05 08:36:51

标签: java xmpp openfire smack

我们有一个XMPP服务器(OpenFire)和一个基于Java Smack XMPP堆栈的自定义客户端。我们使用手动订阅接受,因此客户必须交换订阅和订阅状态。

RFC中所述,订阅状态(“我想订阅您的状态”)由服务器存储,并在每次用户登录时重新发送,直到他回答它们为止。不幸的是,对于答案(“订阅”或“未订阅”)似乎并非如此。如果原始请求者在其他用户回答订阅请求时处于脱机状态,则他不会收到答案。我在XMPP RFC中找不到有关服务器预期行为的任何内容。

我该怎么办?有什么我可能错过的吗?或者是否有实现此用例的标准方法?

This OpenFire forum post表明我正在经历的行为是理想的......

感谢所有指针, 弗洛里安

2 个答案:

答案 0 :(得分:1)

您有两种方法可以确定订阅状态:

  1. 检查请求用户的名单。如果名单中包含有问题的实体的项目,其订阅属性为“to”或“both”,则表示您已订阅。
  2. 第二个选项是向服务器发送另一个订阅包;如果服务器已经接受了状态请求,则服务器应立即代表另一个用户进行响应。

答案 1 :(得分:0)

所以 Alice 想要订阅 Bobs 状态信息并发送订阅请求。服务器将向 Bob 发送通知,直到他回答。现在你的问题是,服务器不会通知 Alice ,如果她已离线,而 Bob 会对请求作出反应。所以 Alice 只会偶然得到 Bobs 的答案。

如果 Bob 同意交换状态信息, Alice 会在她的名单上注意到这一点 - 她会看到 Bobs 存在(离开,空闲) ,...)。否则,她将不知道,如果请求仍未决或者 Bob 拒绝了她的请求。

可以通过在openfire服务器上实现和添加自定义模块来更改此行为。 Openfire有一个API。

此模块将对确认消息作出反应,并可向订阅者发送所有待处理或最近确认的订阅消息的状态消息(在每次登录时)。您的客户端代码可以处理这些消息,并以适当的方式向订户显示此状态。