ejabberd如何将脱机聊天保存到假脱机表中

时间:2016-04-02 05:30:18

标签: erlang xmpp ejabberd smack asmack

我使用ejabberd开源服务器来实现我的聊天应用程序。它在传递和接收消息方面取得了成功,但有时传递确认和读取确认都会丢失。

如果客户端将连接关闭会话节发送到ejabberd服务器,则肯定会将其他消息存储在假脱机表中。考虑客户端网络中存在问题的情况,并且客户端在没有向服务器发送关闭会话节的情况下断开连接。服务器假定客户端仍处于联机状态,并且不会将消息存储到假脱机表中。

但是当客户端联机时,所有待处理的消息都会传递给客户端(当服务器认为客户端处于联机状态时,假脱机加上一些消息)。

ejabberd在哪里存储离线消息而不是假脱机表?

1 个答案:

答案 0 :(得分:3)

如果没有正确关闭会话,那么根据您的服务器内核TCP / IP配置,服务器可能会采取意愿来检测连接是否已丢失。在这种情况下,不会通知ejabberd TCP连接无效并在该TCP连接上发送消息。服务器在TCP堆栈中缓冲它们。从ejabberd的角度来看,这些消息已经发送,因此它们不需要存储在离线存储中。当没有为给定用户打开会话时,ejabberd会将消息存储在离线存储中,但在这种情况下,会有一个打开的会话。

要为具有ejabberd社区版本的邮件添加更高级别的可靠性,您需要实现确认和可能的ping。您可以考虑实施XEP-0198: Stream Management并可能从服务器启用XMPP Ping以检测连接丢失。