用先前的流ID连接到xmpp服务器

我正在使用xmpp over Ejabbered for server构建一个聊天应用程序,并为Android客户端提供了一些帮助

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

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


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

  • 首先检查是在服务器端启用mod_offline。
  • 如果启用mod_offline,则检查服务器端的脱机消息限制。 它应该大于0。
  • 使用PingManager来稳定连接。 我在这里把示例代码使用PingManager在android-
  • 在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();
            } 
        }
    }  
    

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


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

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

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

    mod_stream_mgmt : 
      resume_timeout :60
      resend_on_timeout: true
    

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

    链接地址: http://www.djcxy.com/p/94155.html

    上一篇: smack connect to xmpp server with previous stream id

    下一篇: ejabberd server with ruby on rails