HOWTO · Java
java.net.SocketException: 소프트웨어로 인한 연결 중단: Java에서 Recv 실패
이 튜토리얼은 java.net.SocketException: 소프트웨어로 인한 연결 중단: Java에서 recv 실패 오류를 해결하는 방법을 보여줍니다.
이 페이지의 내용
이 자습서에서는 Java에서 다음 오류를 해결하는 방법을 보여줍니다.
java.net.SocketException: Software caused connection abort: recv failed
Java에서 java.net.SocketException: 소프트웨어로 인한 연결 중단: 수신 실패 해결
SocketException은 소켓에 액세스하려고 할 때 발생하는 IOException의 하위 클래스입니다. 소프트웨어로 인한 연결 중단: 수신 실패는 시간 초과와 같은 네트워크 오류가 발생하거나 서버가 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가 프로세스를 다시 시도합니다.