1. ホーム
  2. git

ソフトウェアが原因で接続が中断された:recv failed エラーの説明

2022-02-21 20:44:16

解決策1.

ソフトウェアが原因で接続が中断された:recvに失敗
java.net.SocketException: ソフトウェアが原因で接続が中断されました:recvに失敗しました
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129) 
この例外が発生する原因は、Software causedに示すように様々です。
これは、ネットワークの問題ではなく、プログラミングの問題によるものです。
この例外が発生することが知られているシナリオの1つは、次のとおりです。

クライアントとサーバーが短いtcp接続を確立し、クライアントがリクエストを送信するたびに、サーバーが応答してクライアントとの接続を閉じます。サーバーが接続を閉じた後、クライアントが接続を解放しない場合、クライアントは引き続きリクエストの送信とレスポンスの受信を試みます。このとき、次のようなエラーが発生します。 .
このとき、クライアントソケットのgetOutputStreamから返されるOutPutStreamはローカルの接続状態を保持しており、リモートサーバーが対応するInputStreamとソケットを閉じたことを知る術はないため、out.write(sendbuf, 0, sendbuf. length);メソッドは呼ばれるが、実際にはサーバーはクライアントからリクエスト情報を受け取っていないことになる。例外が発生しないので、あたかもクライアントのリクエストが正常に送信されたかのように錯覚します。
次に、etInputStreamのin.read(header, 0, 14);メソッドを呼び出します。今回はサーバー側の情報を読み込んでいるため、Software caused connection abort: recv failed exceptionがスローされます。
原因をまとめると、サーバー/クライアントが一方的にコネクションを閉じた場合、相手側はまだtcp接続が確立されていると思い、相手側の応答データを読もうとしたため、Software caused connection abort: recv failed exceptionが発生したということである。
したがって、データを受信する前に、まず接続状態を判断する必要があります。inputstream の available() メソッドは、応答があるかどうかを判断するために使用される。available() が 0 を返した場合は、相手側が切断したためか応答がなく、available() が 0 以上を返した場合は、応答があることになる。また、available() が返す値はノンブロッキングであり、複数のスレッドからアクセスできることも注目すべき点である
相手側が接続を解放した後、ローカル接続も解放する必要があります。

Original code.
            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() ; modified code: 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(& quot;The link to the server is broken") ; break ; } } localObject1.close() ;

解決策2.

ソケットが接続を確立すると同時に、データを読もうとすると、つまりread,catchすると、すぐに例外メッセージが表示される

ソフトウェアが原因で接続が中断されました: Recv failed"

その後、議論の末、送信したデータが監視センターサーバから指定されたプロトコルデータと不整合であることが判明し、正常にログインしなかったため、データを全く受け付けないことになった

NIOパッケージは使っていないし、この例外は何らかのjava.net.のものなのではないかと思えてきた。

以下は4つのエラーメッセージです。

SocketException:Connection reset by peer: socket write error java.net: ソフトウェアが原因で接続が中断された :socket write エラー

java.net.SocketException: ソフトウェアが原因で接続が中断されました: 回復に失敗しました

取得元:https://www.cnblogs.com/dengjiali2015/p/4560542.html