【问题标题】:smack connect to xmpp server with previous stream idsmack 使用先前的流 id 连接到 xmpp 服务器
【发布时间】:2017-04-11 04:39:20
【问题描述】:

我正在使用 xmpp over Ejabbered 为服务器构建一个聊天应用程序,并为 android 客户端构建一个 smack

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

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

【问题讨论】:

  • 您可以在服务器端使用 mod_offline 模块。
  • mod_offline 添加并在用户未与任何客户端联机的情况下工作,但是如果有资源(客户端与打开的会话连接),则消息将存储在该会话内的队列中,在同一客户端创建新会话消息的情况会丢失@HareKumar

标签: android xmpp ejabberd smack


【解决方案1】:

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

  • 首先检查是否在服务器端启用了 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 认证检查会话状态时,使用下面的代码发送和请求所有待处理的流-

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

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

【讨论】:

  • 在 sendSmAcknowledgement() 和 requestSmAcknowledgement() 中添加了什么代码
  • 我刚开始使用 smack,请告知什么是维持稳定会话的最佳间隔时间(ACCORDING_SERVER_PING_INTERVAL)
  • @SathishGadde 默认情况下通常为 1 分钟。但是您的服务器配置可能会有所不同。检查服务器端的 ping 间隔并将其设置为客户端 Smack。
  • xmpp.client.idle.ping : true ,在我的服务器端。未添加任何 server_ping_interval。如果可能,请与示例分享属性名称
  • @SathishGadde 看看这个 XEP xmpp.org/extensions/xep-0199.html
【解决方案2】:

经过大量搜索,我终于将 Ejabberd 服务器升级到最新版本 17.03

他们在哪里添加了新模块 mod_stream_mgmt,并更改了流管理的行为,所以当我创建一个新连接时,它会重新绑定到旧连接并接收未发送和未处理的消息

为了激活 mod_stream_mgmt,我使用了以下配置:

mod_stream_mgmt : 
  resume_timeout :60
  resend_on_timeout: true

注意: 我还在服务器端激活了 mod_ping,我不知道这是否对这个过程和案例有直接影响,但现在我的客户没有丢失任何消息。

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 2016-11-05
    • 2023-03-24
    • 2014-10-12
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2015-07-15
    • 2015-09-28
    相关资源
    最近更新 更多