AndroidStudio報錯Software caused connection abort: recv failed


Software caused connection abort: recv failed 

這個問題網上有一種說法

已知會導致這種異常的一個場景如下: 
客戶端和服務端建立tcp的短連接,每次客戶端發送一次請求, 
服務端響應后關閉與客戶端的連接. 
如果客戶端在服務端關閉連接后,沒有釋放連接,繼續試圖發送請求和接收響應. 
這個時候就會出錯. 

這個時候客戶端Socket的getOutputStream返回來的OutPutStream維護 
的是本地的連接狀態, 
無法知道遠程的服務端已經關閉了對應的InputStream和socket因此 
雖然調用了 
out.write(sendbuf, 0, sendbuf.length); 
方法,但是實際上服務端並沒有接收到客戶端的請求信息. 
因為沒有拋出異常,因此造成了誤以為客戶端請求發送成功的假象. 

接下來調用etInputStream的in.read(header, 0, 14);方法. 
因為這次要讀取服務端的信息,因此產生了 
Software caused connection abort: recv failed的異常 

總結產生原因,在服務端/客戶端單方面關閉連接的情況下,另一方依然以為 
tcp連接仍然建立,試圖讀取對方的響應數據,導致出現 
Software caused connection abort: recv failed的異常. 

因此在receive數據之前,要先判斷連接狀態. 
通過inputstream的available()方法來判斷,是否有響應結果. 
如果available()的返回值為0,說明沒有響應數據,可能是對方已經斷開連接, 
如果available()的返回值大於0,說明有響應數據. 
另外值得注意的是available()返回的值是非堵塞的,可以被多個線程訪問 

在對方釋放連接后,也要釋放本地的連接.

 

然而我的問題是,我要從jcenter()中加載第三方依賴

而微信提供了demo中有版本號,可能中心庫中沒有找到相關版本的依賴,服務器斷開連接了,而AS沒有斷開,所以一直等待到超時,報錯

更換依賴的版本號,就可以解決問題了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM