aSmack丢失消息

3
我在我的Android应用程序中使用aSmack来接收来自桌面Jabber客户端的消息。这很好运行,即使我的Android手机离线(在连接正确关闭后),它也会在下次登录后接收离线消息。
但是,当我在手机上进入飞行模式或关闭手机以使连接突然关闭(没有在Connection对象上调用disconnect()),手机在我的桌面Jabber客户端的联系人列表中保持“在线”一段时间,我可以向其发送消息。但是这些消息永远不会到达。即使手机再次登录服务器。这些消息丢失了。
有人知道如何解决此问题吗?在聊天中丢失消息不是选项。:)
编辑:添加测试代码 BroadcastReceiver:http://pastebin.com/cFLzGXgy 服务:http://pastebin.com/wLpQCQfT 第一个是BroadcastReceiver,每次手机连接到网络时启动服务(第二个URL)。

PS:这只是一个测试代码!如果你想使用/测试它,你必须更改服务器/用户名/密码。


你是否明确编写客户端在登录时执行XEP-13离线消息检索的程序?服务器应该检测到客户端已经离线,如果服务器支持,应该缓存消息以供稍后(符合xep-13标准)检索。 - Flow
在使用XMPP over TCP时,我认为服务器不会“太晚”地识别到关闭的连接。如果TCP套接字在未发送未完成的消息之前关闭,则服务器应该将消息缓存以供以后检索。我从未在asmack和openfire上遇到过这样的问题。 - Flow
2
我收回我之前说的话 :) 我用openfire可以重现这个问题。所以在我看来,这是服务器端的问题,你在客户端或(a)smack中无法做任何事情。看起来openfire目前会丢弃所有发送给具有IOException引用会话的客户端的消息,而不是将消息排队为离线消息。请参见此帖子http://community.igniterealtime.org/thread/45028?tstart=0 - Flow
1
好的,看起来我们必须等到XEP-0198被Jabber服务器和Smack支持,参见这里。在Smack中,它是一个开放的票据,而ejabberd正在处理它的规范。看起来jabberd和Prosody已经支持XEP-0198,但我找不到任何(Android)库...太糟糕了! - Biggie
嗯,当涉及到移动XMPP通信时,XEP-0198是黄金牛。但在服务器和客户端两侧实现起来并不容易。基于Python的XMPP客户端Gajim目前正在开发中。我认为在安卓上完全支持流管理还需要一些时间。也许openfire的开发者/社区能够修复这个错误[OF-464](http://issues.igniterealtime.org/browse/OF-464)。这也将有助于解决这个问题。 - Flow
显示剩余4条评论
3个回答

4

当消息到达时,您可以尝试从客户端B向客户端A发送已传送的消息。问题是,如果客户端A离线(没有连接中断),则直到用户接收到消息并且客户端B无法重新发送消息之前,确认信息才会发送。


1
这个问题出现在你的连接中断时。你需要启用"Stream Management" XEP-198才能实现这些消息。参考这篇博客:http://op-co.de/blog/posts/XEP-0198/基本上它允许确认信息和流恢复,这正是你想要做的。所以你应该等待Smack 4.1版本发布。

1

你可以尝试使用Smackx 消息事件发送收到消息的确认,这将确保消息被传递,否则你需要采取纠正措施。


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