【问题标题】:xmpp with openfire client connection lost suddently with smack 4.1带有openfire客户端连接的xmpp在smack 4.1中突然丢失
【发布时间】:2016-12-02 08:13:07
【问题描述】:

我正在使用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)

任何帮助将不胜感激。

【问题讨论】:

    标签: android xmpp openfire smack


    【解决方案1】:

    无需断开理想用户。

    如果您再次断开连接,则创建一个正在后台运行的服务,并每 10 秒检查一次 xmpp 连接。如果已连接,则无需连接,但如果断开连接,则再次将其连接到服务器。我已经通过我的应用处理了这个问题。

    我在github上也有开源代码。如果你愿意,可以从那里参考。

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      还有另一个转折点。如果您启用了压缩,如果服务器只是关闭套接字,PacketReader 会收到 IOException。如果禁用压缩,如果服务器简单地关闭套接字,PacketReader 会获取 END_DOC。

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

      【讨论】:

        猜你喜欢
        • 2015-08-17
        • 2019-02-20
        • 2021-01-17
        • 2015-07-26
        • 2015-05-24
        • 1970-01-01
        • 2013-08-27
        • 2015-09-28
        • 2015-05-16
        相关资源
        最近更新 更多