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: 소프트웨어로 인한 연결 중단: 수신 실패 해결

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가 프로세스를 다시 시도합니다.

작가: 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