java.net.SocketException: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()返回的值是非堵塞的,可以被多個線程訪問,在對方釋放連接後,也要釋放本地的連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章