2012-05-31 26 views
10

我使用smack構建小型XMPP客戶端/機器人時遇到了相當奇怪的行爲。我設置了連接以及一個ConnectionListener和一個ChatManagerListener。這很好,然後我可以與我的便攜設備上運行的應用程序聊天。Smack客戶端 - 儘管連接中止,但用戶仍處於「在線」狀態

要測試丟失連接的行爲,我將便攜式設備的以太網電纜插入。我預計XMPP客戶端會失去連接,並且用戶將在用戶好友名單中設置爲「脫機」。會發生什麼呢,這個用戶仍然顯示爲'在線',並且我的客戶端的ConnectionListener不會觸發任何事情,無論是connectionClosed還是重新連接失敗或其他。

當我將以太網電纜插回去時,有時就像連接一直處於活動狀態。離線消息被處理,我可以像以前一樣再次聊天。 其他時候,我的客戶完全無法訪問,出現故障,好像所有的聽衆都不見了......但沒有發生任何異議。

這是一個非常奇怪且無法控制的行爲,會讓整個客戶端無法使用,因爲我無法確定客戶端在連接完成後會再次出現。

是否有其他人遇到過這樣的問題或有什麼提示?

如果需要,我可以提供我的代碼,但它實際上只是從Smack文檔複製粘貼&。

回答

8

你實際上是在描述這兩個不同的效果。讓我們從您的問題標題中指定的那個開始:即使連接突然,因此服務器在線也假定用戶,因此不乾淨,中止。原因很簡單,服務器尚未注意到客戶端的斷開連接,因爲XMPP節流沒有完全終止。大多數XMPP服務器每隔X分鐘檢查一次ping。如果客戶端沒有響應,則認爲它已斷開並脫機顯示(如果它是該JID的最後一個連接資源)。這在這裏並沒有發生,並不罕見。因爲有時你想要很長的時間(半小時或更長時間)。

這同樣適用於另一面。如果使用PingManagerPingManagerWithAlarmManager(適用於Android),Smack每X分鐘還會發送XMPP ping。如果使用的套接字有任何問題,則拋出異常。

我希望我能指出你正確的方向。你必須自己調試爲什麼在你的情況下連接不會因爲例外而終止。最後一件事:即使以太網電纜被拔出然後再插入,TCP連接仍然可以輕鬆地在某個超時時間內存活。涉及OSI模型的各個層的許多超時:NAT,TCP,XMPP等等。

+0

感謝,他們可能會幫助我。也許我會更耐心,等待1-2分多鐘才能再次接通電纜。無論如何,聽衆的問題有時候會被調整,有時甚至不會是一個謎。但我想我會爲此提出另一個問題。 – signpainter

+2

我想補充一點,TCP的這種行爲不是一個錯誤,而是一個很少有人喜歡的強大功能。無需重新連接並執行相當昂貴的XMPP流設置,可以節省大量往返時間。 您可能需要的是操作系統告訴您連接丟失和恢復,以便您可以檢查連接是否存活。如果確實如此,就像沒有任何事情一樣運行,否則重新連接。 XEP-0198重新連接也很棒。 – Zash

0

你有太多明確使用disconnect()方法來終止您的連接,否則服務器必須週期性地查驗你實現你的澄清下線

相關問題