簡體   English   中英

Android上的Java-奇怪的套接字行為以及InputStream超時錯誤

[英]Java on Android - Strange socket behavior with InputStream timeout errors

我有一個使用Socket類實例與服務器通信的應用程序。 我使用socket.getInputStream()socket.getOutputStream()返回的流來讀取和寫入數據。

當我的Android應用始終處於“活動狀態”(未最小化)時,通信就沒有問題。 連接持續多長時間都沒有關系。

當我“暫停”應用程序並快速重新打開它時,一切仍然正常。 但是,當我將應用程序暫停約5分鍾並重新打開時, InputStream表現出奇怪的行為:它停止讀取任何內容。 我收到超時錯誤,而不是服務器發送的數據。

連接仍然有效,服務器可以寫入和讀取。 客戶端的isInputShutdown()返回false。

使用網絡分析工具,我還可以看到服務器IN FACT發送的數據已到達客戶端,但InputStream無法以某種方式識別它。

但是,使用OutputStream將數據從客戶端寫入服務器的效果很好。

也許值得一提的是,套接字對象和流被聲明為static ,可用於應用程序的所有活動。 但是由於我在OutputStream沒有任何問題,所以我無法想象這可能是原因。

此時,我唯一的解決方法是關閉整個套接字並將新的套接字連接到服務器。 但這會導致不必要的網絡通信,因為我必須再次握手。 最好不要這樣。

如果有人有類似的經驗並找到了解決方案,請與我分享,我將非常高興。

您應該創建將在后台運行的服務,並實現與服務器的套接字連接。

正如Kevin Krumwiede指出的那樣: 套接字輸出流android的奇怪行為,每隔X分鍾(例如3或4分鍾)發送數據時,即使“暫停”了30分鍾后,一切仍然可以正常工作。

我希望Socket.setKeepAlive(true)足以使連接保持活動狀態,因此我不必造成太多不必要的網絡流量,但是在我的特定情況下,這沒有幫助。

每X分鍾發送1字節的“垃圾”可“解決”問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM