[英]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.