Software caused connection abort: recv failed 錯誤介紹


解決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


免責聲明!

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



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