Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

smack connect to xmpp server with previous stream id

I'm building a chat application using xmpp over Ejabbered for server and smack for android client

I've established connecting , login , send and receiving messages ,then I've faced a problem with user network disconnecting and reconnecting , which has been solved by Reconnecting Manger in smack and xmpp-0198, however there is a case where i need to create a new connection in smack but use the previous session (stream) to get all the messages stored in that session (they don't get stored to offline messages) ,and if i create a new connection with new stream id , user messages get lost .

so is there a connection constructor to implement this solution . or server side configuration to store thous messages to offline messages

like image 798
Ahmed na Avatar asked Nov 08 '22 23:11

Ahmed na


1 Answers

I think one of the following will solve your issue-

  • First check is mod_offline enabled in the server side.
  • If mod_offline enabled then check offline message limit in the server side. It should be greater than 0.
  • Use PingManager to stable your connection. I am here putting sample code to use PingManager in android-

During XMPPTcpConnection initiation-

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

When XMPPTcpCOnnection authenticated-

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

private void configurePingManager() {
    pingManager.setPingInterval(ACCORDING_SERVER_PING_INTERVAL);
    pingManager.pingServerIfNecessary();
}
  • Make sure stream_management enabled both in server side and client side. I am here putting a sample code to enable stream_management for android client side-

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

When XMPPTcpCOnnection authenticated checking session status send and request all pending streams using the code below-

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

Hope following all those steps your problem will be solved.

like image 81
Barno Avatar answered Nov 15 '22 07:11

Barno