gpt4 book ai didi

android - smack 使用之前的流 ID 连接到 xmpp 服务器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:35 25 4
gpt4 key购买 nike

我正在为服务器使用基于 Ejabbered 的 xmpp 和为 android 客户端使用 smack 构建一个聊天应用程序

我已经建立了连接、登录、发送和接收消息,然后我遇到了用户网络断开和重新连接的问题,这已经通过 smack 和 xmpp-0198 中的 Reconnecting Manger 解决了,但是有一种情况是我需要在 smack 中创建一个新连接,但使用上一个 session (流)来获取存储在该 session 中的所有消息(它们不会存储到离线消息中),如果我用新的流 ID 创建一个新的连接,用户消息就会丢失。

那么是否有一个连接构造函数来实现这个解决方案。或服务器端配置以将千条消息存储为离线消息

最佳答案

我认为以下其中一项可以解决您的问题-

  • 首先检查服务器端是否启用了 mod_offline。
  • 如果启用了 mod_offline,则检查服务器端的离线消息限制。它应该大于 0。
  • 使用 PingManager 来稳定您的连接。我在这里放置示例代码以在 android 中使用 PingManager-

在 XMPPTcpConnection 启动期间-

pingManager = PingManager.getInstanceFor(this.connection);
pingManager.registerPingFailedListener(new PingFailedListener() {
@Override
public void pingFailed() {
// session dropped, request for reconnection
}
});

当 XMPPTcpCONnection 通过身份验证时-

@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
configurePingManager();
}

private void configurePingManager() {
pingManager.setPingInterval(ACCORDING_SERVER_PING_INTERVAL);
pingManager.pingServerIfNecessary();
}
  • 确保在服务器端和客户端都启用了 stream_management。我在这里放了一个示例代码来为 Android 客户端启用 stream_management-

xmppTcpConnection.setUseStreamManagement(true); xmppTcpConnection.setUseStreamManagementResumption(true);

当 XMPPTcpCONnection 通过身份验证检查 session 状态时,使用以下代码发送和请求所有待处理的流-

@Override
public void authenticated(XMPPConnection connection, boolean resumed) {
configurePingManager();
if (!resumed) {
try {
xmppTcpConnection.sendSmAcknowledgement();
xmppTcpConnection.requestSmAcknowledgement();
} catch (SmackException.NotConnectedException | StreamManagementException.StreamManagementNotEnabledException e) {
e.printStackTrace();
}
}
}

希望按照所有这些步骤解决您的问题。

关于android - smack 使用之前的流 ID 连接到 xmpp 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43180590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com