programing

java.net.SocketException : 소프트웨어로 인한 연결 중단 : recv 실패

nasanasas 2020. 10. 22. 08:06
반응형

java.net.SocketException : 소프트웨어로 인한 연결 중단 : recv 실패


다음 오류가 정확히 무엇을 의미하는지에 대한 적절한 답을 찾지 못했습니다.

java.net.SocketException: Software caused connection abort: recv failed

메모:

  • 이 오류는 드물며 예측할 수 없습니다. 이 오류가 발생하면 향후 URI에 대한 모든 요청도 실패합니다.
  • 작동하는 유일한 솔루션 (또한 가끔씩 만)은 Tomcat 및 / 또는 실제 시스템 (이 경우 Windows)을 재부팅하는 것입니다.
  • URI는 확실히 사용할 수 있습니다 (브라우저에 가져 오기를 요청하여 확인 됨).

관련 코드 :

BufferedReader reader;
try { 
 URL url = new URL(URI);
 reader = new BufferedReader(new InputStreamReader(url.openStream())));
} catch( MalformedURLException e ) { 
 throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream

String buffer;
StringBuilder result = new StringBuilder();
while( null != (buffer = reader.readLine()) ) { 
 result.append(buffer); 
}//end while: Got the contents.
reader.close();

이는 일반적으로 TCP 시간 초과와 같은 네트워크 오류가 있음을 의미합니다. 먼저 연결에 스니퍼 (wireshark)를 배치하여 문제가 있는지 확인합니다. TCP 오류가있는 경우 볼 수 있어야합니다. 또한 해당되는 경우 라우터 로그를 확인할 수 있습니다. 무선이 어디에서나 관련되어 있다면 이러한 오류의 또 다른 원인입니다.


이는 클라이언트 인증을 요구하도록 구성된 서버에서 TLS 클라이언트를 인증 할 수없는 경우에도 발생합니다.


이 오류는 연결이 갑자기 닫힐 때 발생합니다 (전송 버퍼에 데이터가있는 동안 TCP 연결이 재설정되는 경우). 이 조건은 훨씬 더 일반적인 '피어 별 연결 재설정'과 매우 유사합니다. 인터넷을 통해 연결할 때 산발적으로 발생할 수 있지만 타이밍이 적절하면 체계적으로 발생할 수도 있습니다 (예 : localhost의 연결 유지 연결).

HTTP 클라이언트는 연결을 다시 열고 요청을 다시 시도해야합니다. 연결이이 상태에있을 때 연결을 닫는 것 외에 다른 방법이 없다는 것을 이해하는 것이 중요합니다. 전송 또는 수신을 시도하면 동일한 오류가 발생합니다.

을 사용하지 말고 재시도 메커니즘, 연결 풀링, 연결 유지 및 기타 여러 기능이있는 URL.open()Apache-Commons HttpClient사용 하십시오.

샘플 사용법 :

HttpClient httpClient = HttpClients.custom()
            .setConnectionTimeToLive(20, TimeUnit.SECONDS)
            .setMaxConnTotal(400).setMaxConnPerRoute(400)
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setSocketTimeout(30000).setConnectTimeout(5000).build())
            .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true))
            .build();
// the httpClient should be re-used because it is pooled and thread-safe.

HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// handle response ...

http 데이터에 액세스하고 있습니까? 표준 라이브러리 대신 HttpClient 라이브러리를 사용할 수 있습니까? 라이브러리에는 더 많은 옵션이 있으며 더 나은 오류 메시지를 제공합니다.

http://hc.apache.org/httpclient-3.x/


이런 일이 발생하는 것을 본 유일한 시간은 연결 상태가 좋지 않거나 누군가 다른 스레드 컨텍스트에서 사용중인 소켓을 닫을 때입니다.


jdbc 연결 문자열에 'autoReconnect = true'를 추가해보십시오.


이는 연결 시간이 초과되거나 원격 호스트가 연결을 종료 할 때 (응용 프로그램 종료, 컴퓨터 종료 등) 수시로 발생합니다. 소켓을 직접 관리하고 통신 프로토콜을 통해 애플리케이션의 연결 해제를 처리 한 다음 호출 shutdownInput하고 shutdownOutput세션을 정리 하면이를 방지 할 수 있습니다 .


Look if you have another service or program running on the http port. It happened to me when I tried to use the port and it was taken by another program.


I too had this problem. My solution was:

sc.setSoLinger(true, 10);

COPY FROM A WEBSITE -->By using the setSoLinger() method, you can explicitly set a delay before a reset is sent, giving more time for data to be read or send.

Maybe it is not the answer to everybody but to some people.


If you are using Netbeans to manage Tomcat, try to disable HTTP monitor in Tools - Servers

참고URL : https://stackoverflow.com/questions/135919/java-net-socketexception-software-caused-connection-abort-recv-failed

반응형