HOWTO · Java

java.net.SocketException: ソフトウェアが原因で接続が中止されました: Java で Recv が失敗しました

このチュートリアルでは、java.net.SocketException: Software due to connection abort: recv failed エラーを Java で解決する方法を示します。

このチュートリアルでは、Java で次のエラーを解決する方法を示します。

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

Java で java.net.SocketException: Software Caused Connection Abort: Recv Failed を解決する

SocketExceptionIOException のサブクラスであり、ソケットにアクセスしようとしたときに発生します。 ソフトウェアが原因で接続が中止されました: Recv Failed は、タイムアウトやサーバーが TLS クライアントを認証できないなどのネットワーク エラーが発生した場合に表示されます。

ほとんどの場合、このエラーは Tomcat などのプラットフォームを使用しているときに発生します。 このエラーは、データがまだバッファ内にある間に TCP 接続がリセットされ、接続が突然停止した場合に発生します。

このエラーは、ピアによる接続リセット 例外に似ています。 以下は、java.net.SocketException: ソフトウェアにより接続が中止されました: recv に失敗しました 例外をスローする例です。

BufferedReader Buffered_Reader;
String URI = "https://www.delftstack.com/";
try {
  URL DEMOURL = new URL(URI);
  Buffered_Reader = new BufferedReader(new InputStreamReader(DEMOURL.openStream()));
} catch (MalformedURLException e) {
  throw new IOException("Enter the correct URL: " + e);
}

String DemoBuffer;
StringBuilder Result_StringBuilder = new StringBuilder();
while (null != (DemoBuffer = Buffered_Reader.readLine())) {
  Result_StringBuilder.append(DemoBuffer);
}
Buffered_Reader.close();

上記のコードは HTTP クライアントにアクセスしようとしていますが、接続が突然閉じられます。 エラーは次の行で発生します。

Buffered_Reader = new BufferedReader(new InputStreamReader(DEMOURL.openStream()));

これは、DEMOURL.openStream() が HTTP クライアントに対して正しく機能しないためです。 Apache Commons HttpClient を使用すると、この問題が解決されます。

HttpClient は接続を再開し、リクエストを再試行します。 HttpClient ライブラリを使用すると、エラー メッセージをよりよく理解できます。 HttpClient には、接続プール、再試行メカニズム、キープアライブ、およびその他の多くの機能があります。

このシナリオで使用されるサンプルを次に示します。

String URI = "https://www.delftstack.com/";
HttpClient Demo_Http_Client =
    HttpClients.custom()
        .setConnectionTimeToLive(10, TimeUnit.SECONDS)
        .setMaxConnTotal(200)
        .setMaxConnPerRoute(200)
        .setDefaultRequestConfig(
            RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(2500).build())
        .setRetryHandler(new DefaultHttpRequestRetryHandler(3, true))
        .build();
// the httpClient can be re-used as it is thread-safe and pooled.

HttpGet Http_Get_request = new HttpGet(URI);
HttpResponse Http_Response = Demo_Http_Client.execute(Http_Get_request);
Buffered_Reader = new BufferedReader(new InputStreamReader(Http_Response.getEntity().getContent()));
// handle the response.

上記のコードはクライアント サーバー操作を適切に処理し、ネットワーク エラーが発生した場合、HttpClient はプロセスを再試行します。