如何强制Openfire在向客户端发送消息时请求确认,如果没有,则返回保存为脱机

时间:2018-06-03 15:50:53

标签: android xmpp openfire smack

我希望你过得愉快。我们等待很长时间让Openfire实现StreamManagement功能,现在我们已经运行了。但是,Openfire中丢包的真正问题仍然保持不变。

客户端断开与互联网的连接,但由于它是在Openfire发送下一次ping之前,服务器认为客户端已连接并发送消息,这显然是在没有请求来自客户端的确认的情况下发生的。因此,如果它没有发送任何内容,请将其保存为离线。

我已经尝试了很多东西来解决这个问题(使用StreamManagement_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);

1 个答案:

答案 0 :(得分:0)

这是一个BUG,请点击此处:

https://issues.igniterealtime.org/browse/OF-963

这是Openfire中的官方Bug。您可以设置用户设置为脱机的时间间隔。但是在版本> 4.0.2无论你设置的时间间隔如何,客户端总是在线的bug。我的Openfire安装使用旧版本4.0.2,因为此BUG尚未修复。

这就是为什么邮件从另一个客户端发送并丢失的原因,因为第一个客户端显示为在线,实际上它不是,而且邮件永远不会收到交付。