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

Sheeraz Gul 2023年10月12日
java.net.SocketException: ソフトウェアが原因で接続が中止されました: Java で Recv が失敗しました

このチュートリアルでは、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 はプロセスを再試行します。

著者: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

関連記事 - Java Error