smack使用上一个流ID连接到xmpp服务器

时间:2017-04-03 09:06:42

标签: android xmpp ejabberd smack

我正在使用xmpp over Ejabbered for server和smack for android client

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

所以有一个连接构造函数来实现这个解决方案。 或服务器端配置,以将消息存储到脱机消息

2 个答案:

答案 0 :(得分: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(真);   xmppTcpConnection.setUseStreamManagementResumption(真);

当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();
        } 
    }
}  

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

答案 1 :(得分:0)

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

他们已经添加了新模块mod_stream_mgmt,并更改了流管理的行为,因此当我创建新连接时,它会重新绑定到旧连接并接收未发送和未处理的消息

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

mod_stream_mgmt : 
  resume_timeout :60
  resend_on_timeout: true

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