android - 如何在向客户端发送消息时强制 Openfire 请求确认,如果没有,则返回保存为离线
问题描述
我希望你今天过得愉快。我们为 Openfire 实现该功能等待了很长时间StreamManagement
,现在我们可以运行它了。但是,Openfire 中丢包的真正问题场景仍然保持不变。
客户端断开与互联网的连接,但由于它是在 Openfire 发送下一个 ping 之前,服务器假定客户端已连接并发送消息,这显然是在没有请求客户端确认的情况下发生的。因此,如果它没有发送任何内容,请将其保存为离线。
我已经尝试了很多方法来解决这个问题(玩过StreamManagement
and _Resumption_
),我能想到的最后一件事是在服务器端编写一个插件并手动完成所有关于存储离线消息的操作,这将需要很长时间。不过我还是觉得这应该有解决办法,不然的话,Openfire就没用了,不是吗?如果有任何解决方案,有人可以帮助我吗?非常感谢。
另外,我想知道,Openfire 不使用 TCP 来维持生命吗?那么,当客户端立即断开连接时,它不应该注意到吗?
我启动与smack连接的方式:
connInter.getConnection().setReplyTimeout(15000);
connInter.getConnection().setUseStreamManagement(true);
//connInter.getConnection().strea
connInter.getConnection().setUseStreamManagementResumption(true);
registerReceiver(mConnReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
DeliveryReceiptManager
.getInstanceFor(connInter.getConnection())
.setAutoReceiptMode(AutoReceiptMode.always);
ReconnectionManager.setEnabledPerDefault(false);
SASLMechanism mechanism = new SASLDigestMD5Mechanism();
SASLAuthentication.registerSASLMechanism(mechanism);
// SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1");
SASLAuthentication.unBlacklistSASLMechanism("DIGEST-MD5");
PingManager.setDefaultPingInterval(180);
解决方案
这是一个BUG在这里检查它:
https://issues.igniterealtime.org/browse/OF-963
这是 Openfire 中的官方错误。您可以设置用户设置为离线的时间间隔。但是在 > 4.0.2 的版本中,无论您设置的时间间隔如何,都存在客户端始终在线的错误。我的 Openfire 安装使用的是 4.0.2 旧版本,因为这个 BUG 尚未修复。
这就是为什么消息从另一个客户端发送并丢失的原因,导致第一个客户端显示为在线,而实际上它不是,并且消息永远不会收到传递的收据。
推荐阅读
- javascript - 在 JS 或 Jquery 中单击页面刷新时没有重置时间的启动计时器?
- swift - 在 iOS 的 flutter_inappwebview 中禁用 Cookie
- excel - 下拉菜单保持可视
- php - 计算PHP中另一个数组中一个数组中单词的出现频率
- python - 如何将 csv 文件转换为列表以便进行数字排序
- python - 在 Python 中安装 PyQt5 给出 SyntaxError: invalid syntax
- javascript - 如何在asp mvc的cshtml视图中调用js函数?
- java - 队列大小超出了 Spring Boot 中使用的 ThreadPoolTaskExecutor 中配置的最大队列容量
- python - 将数据库从 sqllite 切换到 postgre django 时出错
- c# - 如何使用默认和自己的策略在 ASP.net Core WebAPI 中启用 CORS