当互联网连接丢失时,XMPP ejabberd在线离线状态问题

4
我已经设置了ejabberd作为移动应用程序之间的XMPP服务器,即自定义iPhone和Android应用程序。但是,我似乎遇到了ejabberd处理在线状态的限制。假设有两个用户A和B互为朋友并且正在进行当前的实时聊天对话。假设其中一个人失去了互联网连接,那么就没有办法立即将他的状态更新到服务器。因此,他的状态仍然在线。解决此问题的一种方法是在XMPP中使用mod_ping模块。但是它也有一定的限制,它会在32秒间隔后对每个客户端进行ping操作。因此,在用户状态更新方面总会有30到40秒的延迟。我希望在良好的网络条件下能够即时更新任何用户的状态(少于10秒),就像whatsapp一样。这是每个聊天应用程序都面临的第一个情景,希望有人能够通过这个帮助我。

Mod ping 没有 32 秒的延迟。事实上,在 smack 中我使用了一个 10 到 15 秒的超时时间,如果没有响应,则宣布为离线。你是怎么得出 32 秒的数值的? - Harshit Bangar
嗨,感谢您的评论。在开发过程中,我个人也有同样的感受,而且我参考的所有文档也都说了同样的话。您可以在这里查看 https://www.process-one.net/docs/ejabberd/guide_en.html#modping - RamjanSayyad
不,这是服务器对客户端的ping。在这种情况下,服务器会等待32秒钟才宣布客户端离线。然后将广播出现。请注意,还有resume_time/max_resume_time(默认为5分钟),因此当您不手动断开连接时,总延迟将为5分钟+32秒。你应该尝试客户端对客户端ping-https://www.igniterealtime.org/builds/smack/docs/4.1.4/javadoc/org/jivesoftware/smackx/ping/PingManager.html#ping%28java.lang.String,%20long%29。 - Harshit Bangar
我并没有完全理解mod_ping和resume_time/max_resume_time的行为,我将详细查看它们的每个功能,但这是否有助于解决我的问题? - RamjanSayyad
如果您想基于用户的存在性来制作您的应用程序,则无法做到不耗费用户的电量。更好的想法是使用客户端对客户端进行ping,但这更像是一种轮询而不是实际的推送。 - Harshit Bangar
如果我减少ping间隔时间,那么就会出现新的问题,导致电池更快地耗尽,因此我正在寻找其他替代方案。但是关于客户端到客户端的ping或轮询,我没有听懂你的意思。我的意思是我们如何实现这一点? - RamjanSayyad
1个回答

2
在ejabberd即将推出的15.12版本中,你将拥有一个新的mod_ping选项:ping_ack_timeout。你可以设置任何超时时间。
这已经在主分支中可用了,所以如果你想使用它,现在就可以使用了:https://github.com/processone/ejabberd

谢谢Mickaël Rémond让我知道这个信息,一旦它上市了,我会仔细研究它。 - RamjanSayyad
嗨Mickel,mod_ping选项:ping_ack_timeout也适用于早期版本。所以我应该选择15.11还是在即将发布的15.12版本中有更好的选项可用于解决我的问题? - RamjanSayyad
它在15.11版本中可用,但被错误地报告为未知选项。它可以正常工作,所以如果您忽略该警告,应该不会有问题。 - Mickaël Rémond
实际上我们正在开发类似于What's up的应用程序。因此,我认为使用最新版本是最好的选择。那么,选择beta 15.12版本是否好呢?我的意思是它是否稳定,或者我们应该选择15.11版本,然后在15.12发布后再进行升级。 - RamjanSayyad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接