带有openfire客户端连接的xmpp突然失败,带有smack 4.1

时间:2016-07-28 05:36:06

标签: android xmpp openfire smack

我正在使用XMPPTCPConnection连接我的openfire服务器,已成功连接并成功发送/接收数据包。连接保持稳定,但突然下降,异常,我不知道这个异常。 我的服务器断开空闲用户时间是60秒。我已经实现了所有ping管理器和重新连接代码。所以它重新连接,但没有得到它与异常断开连接或如何解决此异常。

 E/MainService: Connection to XMPP server was lost.org.jivesoftware.smack.SmackException: Parser got END_DOCUMENT event. This could happen e.g. if the server closed the connection without sending a closing stream element 
 07-28 10:21:22.003 12719-16068/com.thatsit.android D/SMACK:
 XMPPConnection closed due to an exception (0)
 07-28 10:21:22.003 12719-16068/com.thatsit.android W/System.err: org.jivesoftware.smack.SmackException: Parser got END_DOCUMENT event. This could happen e.g. if the server closed the connection without sending a closing stream element

 07-28 10:21:22.003 12719-16068/com.thatsit.android W/System.err:     at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1170)

07-28 10:21:22.003 12719-16068/com.thatsit.android W/System.err:     at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:952)
07-28 10:21:22.003 12719-16068/com.thatsit.android W/System.err:     at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:967)
07-28 10:21:22.013 12719-16068/com.thatsit.android W/System.err:     at java.lang.Thread.run(Thread.java:818)

任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:0)

无需断开理想用户。

如果再次断开连接,则创建一个在后台工作的服务并每隔10秒检查一次xmpp连接。如果已连接,则无需连接,但如果断开连接,则再次将其连接到服务器。我已经从我的应用程序处理了这个。

我还在github上打开了源代码。如果您愿意,可以从那里参考。

这不是4.1的更新代码,但我已经进行了更改但需要上传。今天晚上我将上传更新的代码。

谢谢,希望这有助于解决您的问题。

答案 1 :(得分:0)

实际上有两个与你有关的问题:一个在Openfire 4.x.x中,一个在Smack 4.0.7库中。

Openfire 4.x.x及更高版本中存在一个错误(OF-1308),当服务器断开客户端连接时,它不会将流的结束标记作为故意断开连接发送到客户端。它只是关闭套接字并导致PacketReader获得END_DOC事件。

在Smack中,PacketReader处理IOException(意外丢失网络连接),流的结束标记(故意断开连接)或END_DOC(服务器崩溃等服务器意外断开连接。)获取IOException将触发Reconnection Manager(如果是启用。获取流的结束标记将触发正常的连接关闭事件。但是,Smack将END_DOC视为获取流的结束标记。在我看来,Smack应该将END_DOC视为IOException,因为尚未收到流的结束标记。

还有另一种扭曲。如果启用了压缩,则如果服务器只是关闭套接字,则PacketReader会获得IOException。如果禁用压缩,则如果服务器只是关闭套接字,则PacketReader将获得END_DOC。

在您的情况下,当启用空闲超时时,客户端不应触发ReconnectionManager。否则,它会失去空闲超时的目的。我正在测试我的修复,所以我还没有向Ignite社区报告Smack错误。