2012-05-24 180 views
2

我正在寫一個使用TCP套接字連接的客戶端 - 服務器應用程序。在我的android項目中,Service創建一個用於監聽TCP套接字的線程。Android很長一段時間後TCP套接字連接失敗

一切似乎確定。但我有一個問題..我的網絡服務在後臺運行良好;但一段時間後(10-15分鐘),當我嘗試再次打開我的應用程序(主要活動)時,我無法從套接字連接獲取響應。它凍結或什麼?我不能發送或從套接字獲取TCP消息..這可能是什麼原因?我正在通過3G連接在我的手機上工作。

(此外,在模擬器中運行的應用程序還沒有得到這樣的這個問題,我認爲它的連接是穩定的,長期的過程)

謝謝您的回答。

+0

定義「無法從套接字連接獲取響應」。你的意思是在閱讀時?並定義「它凍結或什麼」。究竟發生了什麼?沒有?例外? – EJP

+0

沒有例外..我通過發送保存活動包解決了這個問題.. –

回答

0

當我在我的應用程序中遇到類似情況時,通常是因爲電話的功率優化(不能被覆蓋)。如果套接字閒置時間過長,它會自動關閉並需要重新打開。

1

由於功耗優化和連接可能的變化(GPRS/HSDPA/Wifi),很可能您的連接正在被丟棄。

爲了保持連接,您的後臺服務需要使用PowerManager類聲明喚醒鎖。這可以防止設備進入省電模式,從而斷開您的插座。但要小心,這會顯着降低設備的電池壽命。

此外,您需要處理連接中斷開您的打開連接的更改。 Android發送名爲android.net.conn.CONNECTIVITY_CHANGE的廣播消息以通知連接性的變化。

根據您的使用情況我會當設備處於睡眠模式與輪詢當設備處於有效使用中或剛使用C2DM推送通知

+0

嗯,謝謝你的回答。是發送保持活着的數據包每3分鐘或什麼可以成爲我的解決方案?你怎麼看? –

+0

我想你可以用一個喚醒鎖來做到這一點,但是你可能最終每隔3分鐘重新連接一次。你能更具體地說明你需要什麼嗎?聊天,推送通知? –

+0

是的,它可以是聊天通知..但重要的一點是,當我重新打開我的應用程序,建立連接不提供。連接失去了某種程度。我必須強制停止我的應用程序。這是一個問題。 –

0

你是從發送數據僅建立一個連接時間到?像執行心跳協議一樣?如果你不是,你應該......或者它可能與套接字讀/寫超時有關

+0

嗯我不發送任何數據的時間,我應該每隔3min發送保持活着的數據包? –