URL이 작동 중일 때 "java.net.ConnectException : Connection timed out"예외가 발생하는 이유는 무엇입니까?


86

나는납니다 ConnectException: Connection timed out내 코드에서 일부 주파수. 내가 조회하려는 URL이 올라 왔습니다. 일부 사용자에게는 동일한 코드가 작동하지만 다른 사용자에게는 작동하지 않습니다. 한 사용자가이 예외를 받기 시작하면 계속해서 예외가 발생하는 것 같습니다.

다음은 스택 추적입니다.

java.net.ConnectException: Connection timed out
Caused by: java.net.ConnectException: Connection timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    at java.net.Socket.connect(Socket.java:516)
    at java.net.Socket.connect(Socket.java:466)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
    at sun.net.www.http.HttpClient.New(HttpClient.java:287)
    at sun.net.www.http.HttpClient.New(HttpClient.java:299)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840)

다음은 내 코드의 일부입니다.

URLConnection urlConnection = null;
OutputStream outputStream = null;
OutputStreamWriter outputStreamWriter = null;
InputStream inputStream = null;

try {
    URL url = new URL(urlBase);
    urlConnection = url.openConnection();
    urlConnection.setDoOutput(true);

    outputStream = urlConnection.getOutputStream(); // exception occurs on this line
    outputStreamWriter = new OutputStreamWriter(outputStream);
    outputStreamWriter.write(urlString);
    outputStreamWriter.flush();
    inputStream = urlConnection.getInputStream();
    String response = IOUtils.toString(inputStream);
    return processResponse(urlString, urlBase, response);
} catch (IOException e) {
    throw new Exception("Error querying url: " + urlString, e);
} finally {
    IoUtil.close(inputStream);
    IoUtil.close(outputStreamWriter);
    IoUtil.close(outputStream);
}

7
문제를 해결 한 경우 하나의 답변을 수락 된 것으로 표시하십시오. :)
Tobias

답변:


84

연결 시간 초과 (로컬 네트워크 및 여러 클라이언트 시스템 가정)는 일반적으로

a) 송신자에게 "호스트에 대한 경로 없음"과 같은 것을 알리지 않고 패킷을 간단히 먹는 일종의 방화벽

b) 잘못된 네트워크 구성 또는 회선 과부하로 인한 패킷 손실

c) 서버에 과부하가 걸리는 너무 많은 요청

d) 서버에서 동시에 사용할 수있는 적은 수의 스레드 / 프로세스로 인해 모든 스레드를 가져옵니다. 이는 특히 실행하는 데 오랜 시간이 걸리고 c)와 결합 될 수있는 요청에서 발생합니다.

도움이 되었기를 바랍니다.


이 문제를 디버깅하는 데 도움이 된 것은 내가 요청한 서버를 ping하는 것이 었습니다. 내가 의도 한 개인 IP가 아닌 공용 IP로 확인 된 URL을 발견했습니다. / etc / hosts 파일의 새 매핑으로 문제를 해결할 수 있습니다. 다른 사람이 비슷한 문제에 직면 할 경우를 대비하여 댓글을 추가하고 있습니다.
Bouramas 2010 년

31

URL이 동일한 시스템의 웹 브라우저에서 제대로 작동하는 경우 Java 코드가 브라우저가 URL에 연결하는 데 사용하는 HTTP 프록시를 사용하지 않는 것일 수 있습니다.


6

오류 메시지는 모든 것을 알려줍니다 : 연결 시간이 초과되었습니다. 이는 귀하의 요청이 일부 (기본) 기간 내에 응답을받지 못했음을 의미합니다. 응답이 수신되지 않은 이유는 다음 중 하나 일 수 있습니다.

a) IP / 도메인 또는 포트가 올바르지 않습니다.

b) IP / 도메인 또는 포트 (예 : 서비스)가 다운되었습니다.

c) IP / 도메인이 응답하는 데 기본 시간 초과보다 오래 걸립니다.

d) 사용중인 포트에 관계없이 요청 또는 응답을 차단하는 방화벽이 있습니다.

e) 특정 호스트에 대한 요청을 차단하는 방화벽이 있습니다.

f) 인터넷 액세스가 중단되었습니다

g) "rest-API 호출"의 경우 라이브 서버가 다운되었습니다.

ISP에서 방화벽과 포트 또는 IP 차단을 설정할 수 있습니다.


4

출력 스트림을 가져 오기 전에 다음과 같이 연결 제한 시간을 늘리는 것이 좋습니다.

urlConnection.setConnectTimeout(1000);

1000은 밀리 초 단위입니다 (1000 밀리 초 = 1 초).


21
그것은 그것을 높이는 것이 아니라, 그것을 극적으로 낮추는 것입니다. 기본적으로 1 분 정도이며 늘릴 수없고 낮출 수만 있습니다.
Marquis of Lorne

3
  • 텔넷을 사용하여 방화벽 문제를 확인하십시오.
  • 수행 tracert/ traceroute홉 수 찾기

어디로가는 길?
항공기

분명히, 어떤 IP로 오류가 발생했는지.
John Lord

3

내 문제를 다음과 같이 해결했습니다.

System.setProperty("https.proxyHost", "myProxy");
System.setProperty("https.proxyPort", "80");

또는 http.proxyHost...


1

이것은 IPv6 문제 일 수 있습니다 (호스트가 IPv6 AAAA-Address를 게시하고 사용자 호스트가 IPv6 용으로 구성되었다고 생각하지만 실제로는 올바르게 연결되지 않음). 네트워크 MTU 문제, 방화벽 차단 또는 대상 호스트가 모두 연결할 수없는 다른 IP 주소 (임의로 또는 발신자 국가 기반)를 게시 할 수도 있습니다. 또는 유사한 네트워크 문제.

시간 제한을 설정하고 좋은 오류 메시지를 추가하는 것 외에는 많은 일을 할 수 없습니다 (특히 호스트의 확인 된 주소를 인쇄하는 것). 더 강력한 재 시도를 추가하려면 모든 주소를 병렬로 시도하고 Java 플랫폼에서 이름 확인 캐싱 (양수 및 음수)을 조사합니다.


1

URL이 작동 중일 때 "java.net.ConnectException : Connection timed out"예외가 발생하는 이유는 무엇입니까?

URLConnection (HttpURLConnection / HttpsURLConnection)이 불규칙하기 때문입니다. 여기여기에서 이에 대해 읽을 수 있습니다 . 우리의 솔루션은 두 가지였습니다.

a) 다음을 통해 ContentLength 설정 setFixedLengthStreamingMode

b) TimeoutException을 포착하고 실패하면 재 시도합니다.


0

IP / 호스트가 원격 호스트에 의해 차단 될 가능성이 있습니다. 특히 사용자가 너무 세게 공격한다고 생각하는 경우에는 더욱 그렇습니다.


0

나에게 이런 일이 발생한 이유는 원격 서버가 특정 IP 주소 만 허용하고 자체 IP 주소는 허용하지 않았기 때문이며 서버의 URL에서 이미지를 렌더링하려고했습니다. 했다 ...

서버가 자체 IP를 허용하거나 실제로 존재하는 일부 원격 URL에서 렌더링하고 있는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.