我们有一个XMPP服务器(OpenFire)和一个基于Java Smack XMPP堆栈的自定义客户端。我们使用手动订阅接受,因此客户必须交换订阅和订阅状态。
如RFC中所述,订阅状态(“我想订阅您的状态”)由服务器存储,并在每次用户登录时重新发送,直到他回答它们为止。不幸的是,对于答案(“订阅”或“未订阅”)似乎并非如此。如果原始请求者在其他用户回答订阅请求时处于脱机状态,则他不会收到答案。我在XMPP RFC中找不到有关服务器预期行为的任何内容。
我该怎么办?有什么我可能错过的吗?或者是否有实现此用例的标准方法?
This OpenFire forum post表明我正在经历的行为是理想的......
感谢所有指针, 弗洛里安
答案 0 :(得分:1)
您有两种方法可以确定订阅状态:
答案 1 :(得分:0)
所以 Alice 想要订阅 Bobs 状态信息并发送订阅请求。服务器将向 Bob 发送通知,直到他回答是或否。现在你的问题是,服务器不会通知 Alice ,如果她已离线,而 Bob 会对请求作出反应。所以 Alice 只会偶然得到 Bobs 的答案。
如果 Bob 同意交换状态信息, Alice 会在她的名单上注意到这一点 - 她会看到 Bobs 存在(离开,空闲) ,...)。否则,她将不知道,如果请求仍未决或者 Bob 拒绝了她的请求。
可以通过在openfire服务器上实现和添加自定义模块来更改此行为。 Openfire有一个API。
此模块将对确认消息作出反应,并可向订阅者发送所有待处理或最近确认的订阅消息的状态消息(在每次登录时)。您的客户端代码可以处理这些消息,并以适当的方式向订户显示此状态。