繁体   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