java.net.socketexception : 소프트웨어 원인 연결 중단 : Recv 실패 [Duplication

StackOverflow https://stackoverflow.com/questions/135919

  •  02-07-2019
  •  | 
  •  

문제

이 질문은 이미 여기에 답이 있습니다.

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

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 Connection String에 'AutoreConnect = true'를 추가해보십시오.

이는 연결 시간이 중단되거나 원격 호스트가 연결을 종료 할 때 때때로 발생합니다 (폐쇄 응용 프로그램, 컴퓨터 종료 등). 소켓을 직접 관리하고 통신 프로토콜을 통해 응용 프로그램의 연결 끊김을 처리 한 다음 shutdownInput 그리고 shutdownOutput 세션을 정리합니다.

HTTP 포트에서 다른 서비스 나 프로그램이 실행되는지 확인하십시오. 포트를 사용하려고했을 때 나에게 일어 났고 다른 프로그램에 의해 취해졌습니다.

나도이 문제가 있었다. 내 해결책은 다음과 같습니다.

sc.setSoLinger(true, 10);

웹 사이트에서 복사 -> 사용하여 setSoLinger() 방법, 재설정이 전송되기 전에 명시 적으로 지연을 설정하여 데이터를 읽거나 보내는 데 더 많은 시간을 제공 할 수 있습니다.

어쩌면 그것은 모든 사람에게 대답이 아니라 어떤 사람들에게는 대답 일 것입니다.

NetBeans를 사용하여 Tomcat을 관리하는 경우 도구에서 HTTP 모니터를 비활성화하십시오 - 서버

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top