用先前的流ID连接到xmpp服务器
我正在使用xmpp over Ejabbered for server构建一个聊天应用程序,并为Android客户端提供了一些帮助
我已经建立了连接,登录,发送和接收消息,然后我遇到了用户网络断开和重新连接的问题,这已经通过重新连接管理器在smack和xmpp-0198中解决,但是有一种情况是我需要在smack中创建一个新的连接,但使用前一个会话(流)来获取存储在该会话中的所有消息(它们不会被存储到离线消息中),如果我使用新的流ID创建一个新的连接,丢失 。
所以有一个连接构造函数来实现这个解决方案。 或服务器端配置将这些消息存储到脱机消息中
我认为以下其中一项将解决您的问题 -
在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();
}
}
}
希望遵循所有这些步骤,您的问题将得到解决。
经过大量搜索,最后我升级了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