我正在使用xmpp over Ejabbered for server和smack for android client
我已经建立了连接,登录,发送和接收消息,然后我遇到了用户网络断开连接和重新连接的问题,这已经通过在smack和xmpp-0198中重新连接Manger解决了,但是我需要在smack中创建一个新连接,但使用前一个会话(流)获取存储在该会话中的所有消息(它们不会存储到离线消息) ,如果我使用新的流ID创建新连接,用户消息就会丢失。
所以有一个连接构造函数来实现这个解决方案。 或服务器端配置,以将消息存储到脱机消息
答案 0 :(得分:1)
我认为以下其中一项可以解决您的问题 -
在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();
}
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,我不知道这是否对这个过程和案例有直接影响,但现在我的客户不会遗漏任何消息。