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
を解決する
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
はプロセスを再試行します。
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