2010-08-03 44 views
2

我在Android上開發了一個應用程序,它使用Smack API連接到XMPP服務器。在此應用程序中,我硬編碼用戶登錄信息,即用戶名和密碼。使用Smack從2個不同的Android設備登錄到同一個jabber帳戶

xmpp.login(「admin」,「tigase」);

和我從不同的用戶

PacketFilter濾波器=新 AndFilter(新 PacketTypeFilter(Message.class) 新FromContainsFilter( 「ameya @ mwbn43-1」))得到的數據包;

現在我面臨的問題是,當我在兩個不同的Android設備上運行相同的應用程序一個設備將覆蓋其他設備的憑證,因此,當我試圖發送數據,其中只有一個得到它。 AFAIK在正常的Google Chat中,用戶可以從2個不同的地方登錄到同一個帳戶,並且可以同時在兩個地方接收郵件。

任何人都可以告訴我可能是什麼問題嗎?它與Smack API有關嗎?

感謝,

Ameya

回答

7

,你所要做的,當你登錄

xmpp.login("admin", "tigase", "a random string here"); 

的資源是在概念上與TCP端口類似設置不同的資源。看到這個link。資源字符串用於區分設備的方式登錄到同一個帳戶,即。在桌面上,資源可能是Android上的「桌面」和「android」。但在你的情況下,你有2個Android設備,所以你不能預設資源。您可能希望在Android設備上使用唯一標識符字符串,例如帳戶名稱或IMEI號碼。

使用資源字符串,您可以發送到特定的用戶如

[email protected]/12345 

,其中12345是你的資源或

[email protected] 

到所有登錄用戶。

如果您在應用程序中未使用資源字符串,則可以使用StringUtils.randomString(20)生成一個包含20個字符的隨機字符串。可以在Smack包中找到StringUtils

+0

非常感謝Chuk! – 2010-08-05 19:29:58

+0

@Chuk Lee:如何防止其他用戶登錄同一帳戶,您有解決方案 – Jinu 2016-02-11 05:25:36

2

您只將項目傳送到一個設備而不是兩個設備的原因是Tigase與Google聊天不同,它遵循XEP並將消息傳遞到優先級最低的連接(或最後登錄的設備如果優先級相同)

當您嘗試將JID綁定到特定資源並查看確保您請求的資源實際分配時,您需要非常小心。服務器可能不會給你,因爲它與現有的JID定義的資源衝突。

谷歌聊天服務器做了一些「特殊」的事情,因爲它們將消息傳遞給任何連接的JID,而不管資源或優先級設置如何。有人建議通過設計允許這種行爲有些變化,但尚未被XSF接受。

如果您想要將消息傳遞到所有連接的設備,我建議您考慮在您的Tigase服務器上創建PubSub節點,並將該節點設置爲提供給任何在線JID--然後,所有設備都將收到任何消息如果他們在線,則推送到該節點。

+0

請注意,使用新的[XMPP RFC此行爲現在是一個選項](http://xmpp.org/rfcs/rfc6121.html #規則的localpart-barejid資源)。所以Google Talk遵循規範。 – Flow 2012-08-22 08:28:13

4

作爲一般規則,在Jabber消息被髮送到其連接至服務器的最後一個設備,因此,如果要連接

[email protected]

從兩個不同的設備中,一個其中以後連接將是獲取消息的人。

但是,如果你指定了一個資源,那麼一切都比較容易,所以,可以說你從你的筆記本電腦和手機連接起來,然後你可以用一個完整的jid(jabber id)登錄,使用資源。

[email protected]/laptop

[email protected]/cellphone

現在,如果你想發送給被從你的手機連接的客戶特別收到一個Jabber消息,只是讓確保郵件發送到「[email protected]/cellphone」而不是「[email protected]

相關問題