我正在使用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)
任何帮助都将非常感激。
答案 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错误。