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 を解決する
SocketException は IOException のサブクラスであり、ソケットにアクセスしようとしたときに発生します。 ソフトウェアが原因で接続が中止されました: 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 はプロセスを再試行します。