簡體   English   中英

eJabberd 管理員在斷開連接 / Android XMPP Smack 后仍將用戶視為在線

[英]eJabberd admin still sees user as ONLINE after .disconnect / Android XMPP Smack

我正在為 Android(本機 Java)使用 eJabberd 和 Smack 我一直在嘗試以各種可以想象的方式調用.disconnect()以斷開連接並將用戶設置為離線,但在 eJabberd 管理員上,它始終在線,即使在成功之后斷開。 我使用的一些代碼:

connection.disconnect();

還用過:

    try {
         connection.sendStanza(
               MessageBuilder.buildPresence()
               .ofType(Presence.Type.unavailable)
               .build()
         );
    } catch (SmackException.NotConnectedException | InterruptedException e) {
        e.printStackTrace();
    }

還:

  PresenceBuilder presenceBuilder = connection.getStanzaFactory()
                                .buildPresenceStanza();
                        presenceBuilder.ofType(Presence.Type.unavailable);
                        Presence presence = presenceBuilder.build();
                        try {
                            connection.disconnect(presence);
                        } catch (SmackException.NotConnectedException e) {
                            e.printStackTrace();
                        }

所有這些嘗試都會導致 ConnectionListener 觸發public void connectionClosed() {}

這意味着連接已成功關閉。

那么為什么即使在成功斷開連接后仍然顯示為在線(在線用戶)

我的 iOS 版本,每當我調用[connection disconnect] 時; 和 go 到我的 eJabberd 管理員,用戶顯示為離線(未在“在線用戶”頁面中列出)。

我在這里錯過了什么嗎?

--

他是 Smack 根據自己的調試器發送給 eJabberd 服務器的標簽:

D/SMACK: SENT (1): 
    <presence id='3HD1T-11' type='unavailable'/>
    <a xmlns='urn:xmpp:sm:3' h='16'/>
    </stream:stream>

D/SMACK: RECV (1): 
    </stream:stream>

D/SMACK: XMPPConnection closed (XMPPTCPConnection[myuser@ejabberd.mydomain.com/3432235344…3890484] (1))

D/SMACK: RECV (0): 
    <r xmlns='urn:xmpp:sm:3'/>

D/SMACK: SENT (0): 
    <a xmlns='urn:xmpp:sm:3' h='16'/>

問題是我的 XMPPManager 使用相同的登錄憑證連接/登錄用戶兩次,為同一用戶保持兩個不同的連接。

所以每當我做.disconnect(); 它正在終止其中一個連接,但讓另一個連接仍然在線。

我的解決方案是讓我的 XMPPManager 成為 singleton 並且一次只允許一個用戶連接。

由於連接是異步的,如果它調用兩次(出於任何瘋狂的原因),它仍然會連接同一用戶兩次。

所以我在我的方法連接開始后立即添加了一個 static Boolean 設置為 true 。 這樣我就知道我是否已經開始連接/登錄嘗試,並且在它忙於連接時不允許另一個連接:

if(busyConnecting) {
       return;
}
busyConnecting = true;

我們也可以使用這個:

XMPPTCPConnection.setUseStreamManagementDefault(false);
XMPPTCPConnection.setUseStreamManagementResumptionDefault(false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM