java.net.socketexception : 소프트웨어 원인 연결 중단 : Recv 실패 [Duplication
문제
이 질문은 이미 여기에 답이 있습니다.
다음 오류가 정확히 무엇을 의미하는지에 대한 적절한 답을 찾을 수 없었습니다.
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 라이브러리를 사용할 수 있습니까? 라이브러리에는 더 많은 옵션이 있으며 더 나은 오류 메시지를 제공합니다.
내가 이런 일이 일어난 유일한 시간은 연결이 나쁘거나 누군가가 다른 스레드 컨텍스트에서 사용하는 소켓을 닫을 때입니다.
JDBC Connection String에 'AutoreConnect = true'를 추가해보십시오.
이는 연결 시간이 중단되거나 원격 호스트가 연결을 종료 할 때 때때로 발생합니다 (폐쇄 응용 프로그램, 컴퓨터 종료 등). 소켓을 직접 관리하고 통신 프로토콜을 통해 응용 프로그램의 연결 끊김을 처리 한 다음 shutdownInput
그리고 shutdownOutput
세션을 정리합니다.
HTTP 포트에서 다른 서비스 나 프로그램이 실행되는지 확인하십시오. 포트를 사용하려고했을 때 나에게 일어 났고 다른 프로그램에 의해 취해졌습니다.
나도이 문제가 있었다. 내 해결책은 다음과 같습니다.
sc.setSoLinger(true, 10);
웹 사이트에서 복사 -> 사용하여 setSoLinger()
방법, 재설정이 전송되기 전에 명시 적으로 지연을 설정하여 데이터를 읽거나 보내는 데 더 많은 시간을 제공 할 수 있습니다.
어쩌면 그것은 모든 사람에게 대답이 아니라 어떤 사람들에게는 대답 일 것입니다.
NetBeans를 사용하여 Tomcat을 관리하는 경우 도구에서 HTTP 모니터를 비활성화하십시오 - 서버