2011-01-05 111 views
4

我們有一個XMPP服務器(OpenFire)和基於Java Smack XMPP堆棧的自定義客戶端。我們正在使用手動訂閱接受方式,因此客戶必須交換訂閱和訂閱狀態。XMPP:在原始請求者處於離線狀態(訂閱狀態)時建立雙方訂閱的RFC

RFC所述,訂閱狀態(「我想訂閱您的狀態」)由服務器存儲,並且每次用戶登錄時都會發生怨恨,直到他回答爲止。不幸的是,對於答案(「訂閱」或「取消訂閱」),似乎並非如此。如果原始請求者在其他用戶應答訂閱請求時脫機,則他不會收到答案。我在XMPP RFC中找不到關於服務器預期行爲的任何內容。

我該怎麼辦?有什麼我可能錯過了?還是有一個標準的方法來實現這個用例?

This OpenFire forum post表明,我遇到的行爲是

+1

好的,一種可能的解決方案(以及我使用的方案)是通過自動建立另一種方式來檢查名單上的連接並「修復」當時的所有單向訂閱。 – 2011-01-05 11:29:46

+0

你的解決方案幫了我很多。謝謝。 – 2011-07-14 09:08:10

回答

0

所以愛麗絲想要訂閱鮑勃存在信息,並將所需的一個...

感謝所有的指針, 弗洛裏安訂閱請求。服務器將發送通知到Bob,直到他回答。而你現在的問題是,服務器不會通知愛麗絲,如果她離線,而鮑勃對請求作出反應。所以愛麗絲將得到鮑勃只是偶然的答案。

如果鮑勃同意交換存在信息,愛麗絲會注意到這一點在她的名單 - 她會看到鮑勃存在(離開,空閒,...)。否則,她不會知道,如果請求仍然未決或者Bob拒絕了她的請求。

可以通過在openfire服務器上實現和添加自定義模塊來更改此行爲。 Openfire爲此提供了一個API。

該模塊將對確認消息作出反應,並可以向訂戶(每次登錄時)發送所有未決或最近確認的訂閱消息的狀態消息。您的客戶端代碼可以處理這些消息,並以適當的方式將該狀態呈現給訂戶。

1

你有兩種方式供您決定訂閱的狀態:

  1. 檢查請求用戶的名冊。如果名冊中包含的訂閱屬性爲「to」或「both」的商品,則表示訂閱。
  2. 第二種選擇是發送另一個訂閱數據包給服務器;如果服務器已經接受了在線狀態請求,服務器應該立即響應代表其他用戶的訂閱。