eJabberd管理员在断开连接/Android XMPP Smack后仍然将用户视为联机用户



我正在使用eJabberd和Smack for Android(Native Java(我一直在尝试以各种可以想象的方式调用.disconnect((来断开连接并将用户设置为OFFLINE,但在eJabberd admin上,它总是在线的,即使在成功断开连接之后也是如此。我使用的一些代码:

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版本,每当我调用[断开连接]时并转到我的eJabberd管理员,用户显示为OFFLINE(未在"在线用户"页面中列出(。

我错过什么了吗?

--

他是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成为一个单例,并且一次只允许单个用户连接。

由于连接是异步的,如果它调用两次(出于任何疯狂的原因(,它仍然会连接两次同一用户。

因此,在我的方法连接开始后,我添加了一个静态布尔集为true。这样我就知道我是否已经开始了连接/登录尝试,并且在忙于连接时不允许另一个连接:

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

我们也可以使用这个:

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

最新更新