Software caused connection abort: recv failed 錯誤介紹

來源:互聯網
上載者:User

標籤:

解決1:

Software caused connection abort: recv failed
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129) 
產生這個異常的原因有多種方面,單就如 Software caused 所示,
是由於程式編寫的問題,而不是網路的問題引起的.
已知會導致這種異常的一個情境如下:

用戶端和服務端建立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()返回的值是非堵塞的,可以被多個線程訪問
在對方釋放串連後,也要釋放本地的串連.

原代碼:            URL localurl = new URL(url) ;            URLConnection uc = localurl.openConnection() ;            uc.setRequestProperty("User-Agent","Mozilla/3.5.7 (compatible; MSIE 5.0; Windows NT; DigExt)");            uc.connect() ;            InputStream localObject1 = localurl.openStream();            System.out.println(localObject1.available()) ;            byte[] localObject2 = new byte[131072];            StringBuffer localStringBuffer = new StringBuffer() ;            int j = 0 ;            while ((j = (localObject1).read(localObject2)) > 0){                localStringBuffer.append(new String(localObject2, 0, j, encoder));            }            localObject1.close() ;修改後代碼:            URL localurl = new URL(url) ;            URLConnection uc = localurl.openConnection() ;            uc.setRequestProperty("User-Agent","Mozilla/3.5.7 (compatible; MSIE 5.0; Windows NT; DigExt)");            uc.connect() ;            InputStream localObject1 = localurl.openStream();            System.out.println(localObject1.available()) ;            byte[] localObject2 = new byte[131072];            StringBuffer localStringBuffer = new StringBuffer() ;            int j = 0 ;            while(true){                if(localObject1 .available()>0){                    if((y=localObject1.read(localObject2))>0){                        sb.append(new String(localObject2,0,y,encode)) ;                    } else{                        break ;                    }                }else if(in.available()==0){                    System.out.println("與伺服器的連結已中止") ;                    break ;                }             }            localObject1.close() ;

 

解決2:

當Socket建立串連之後,只要我一讀資料,也就是read,catch馬上得到一個異常資訊

"Software caused connection abort: recv failed"

後面經過論證,原來是我傳輸的資料和監控中心伺服器規定的協議資料不一致,沒有登入成功,所以根本接受不了資料

我沒有使用NIO包,我現在開始懷疑任何一種java.net.SocketException的這個異常都有可能是協議資料不一致造成的,

如下:四種錯誤資訊

java.net.SocketException:Connection reset by peer: socket write error java.net.SocketException:Connection reset java.net.SocketException:Software caused connection abort :socket write error

java.net.SocketException: Software caused connection abort: recv failed

Software caused connection abort: recv failed 錯誤介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.