2016-07-28 68 views
2

我與XMPPTCPConnection工作與我的Openfire服務器的連接成功,發送連接/成功接收的數據包。連接保持穩定,但突然下降,例外,我不知道這個例外。 我的服務器斷開閒置用戶時間爲60秒。我已經實現了所有的ping管理器和重新連接代碼。所以它重新連接,但不知道爲什麼它與異常斷開連接或如何解決此異常。XMPP與Openfire的客戶端連接suddently失去了咂嘴4.1

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

有沒有必要斷開理想的用戶。

如果您再次斷開連接,然後做出了在後臺運行服務,並檢查XMPP連接每10秒。如果連那麼就沒有必要連接,但如果斷開連接,然後再次連接到服務器。我從我的應用程序處理了這個。

我有github也開放源代碼。如果你想,那麼你可以從那裏參考。

這不更新的代碼爲4.1,但我已經做出更改,但需要上傳。今天晚上我會上傳更新的代碼。

感謝,希望這將有助於解決您的問題。

0

其實有涉及到你的兩個問題:一個是Openfire的4.x.x,一個是在拍擊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。

在您的情況下,當啓用了空閒超時時,客戶端不應觸發重新連接管理器。否則,它會破壞空閒超時的目的。我正在測試我的修復程序,因此我還沒有向Ignite社區報告Smack錯誤。