나는납니다 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);
}
답변
연결 시간 초과 (로컬 네트워크 및 여러 클라이언트 시스템 가정)는 일반적으로
a) 송신자에게 “호스트에 대한 경로 없음”과 같은 것을 알리지 않고 패킷을 간단히 먹는 일종의 방화벽
b) 잘못된 네트워크 구성 또는 회선 과부하로 인한 패킷 손실
c) 서버에 과부하가 걸리는 너무 많은 요청
d) 서버에서 동시에 사용할 수있는 적은 수의 스레드 / 프로세스로 인해 모든 스레드를 가져옵니다. 이는 특히 실행하는 데 오랜 시간이 걸리고 c)와 결합 될 수있는 요청에서 발생합니다.
도움이 되었기를 바랍니다.
답변
URL이 동일한 시스템의 웹 브라우저에서 제대로 작동하는 경우 Java 코드가 브라우저가 URL에 연결하는 데 사용하는 HTTP 프록시를 사용하지 않는 것일 수 있습니다.
답변
오류 메시지는 모든 것을 알려줍니다 : 연결 시간이 초과되었습니다. 이는 귀하의 요청이 일부 (기본) 기간 내에 응답을받지 못했음을 의미합니다. 응답이 수신되지 않은 이유는 다음 중 하나 일 수 있습니다.
a) IP / 도메인 또는 포트가 올바르지 않습니다.
b) IP / 도메인 또는 포트 (예 : 서비스)가 다운되었습니다.
c) IP / 도메인이 응답하는 데 기본 시간 초과보다 오래 걸립니다.
d) 사용중인 포트에 관계없이 요청 또는 응답을 차단하는 방화벽이 있습니다.
e) 특정 호스트에 대한 요청을 차단하는 방화벽이 있습니다.
f) 인터넷 액세스가 중단되었습니다
g) “rest-API 호출”의 경우 라이브 서버가 다운되었습니다.
ISP에서 방화벽과 포트 또는 IP 차단을 설정할 수 있습니다.
답변
출력 스트림을 가져 오기 전에 다음과 같이 연결 제한 시간을 늘리는 것이 좋습니다.
urlConnection.setConnectTimeout(1000);
1000은 밀리 초 단위입니다 (1000 밀리 초 = 1 초).
답변
- 텔넷을 사용하여 방화벽 문제를 확인하십시오.
- 수행
tracert
/traceroute
홉 수 찾기
답변
내 문제를 다음과 같이 해결했습니다.
System.setProperty("https.proxyHost", "myProxy");
System.setProperty("https.proxyPort", "80");
또는 http.proxyHost
…
답변
이것은 IPv6 문제 일 수 있습니다 (호스트가 IPv6 AAAA-Address를 게시하고 사용자 호스트가 IPv6 용으로 구성되었다고 생각하지만 실제로는 올바르게 연결되지 않음). 네트워크 MTU 문제, 방화벽 차단 또는 대상 호스트가 모두 연결할 수없는 다른 IP 주소 (임의로 또는 발신자 국가 기반)를 게시 할 수도 있습니다. 또는 유사한 네트워크 문제.
시간 제한을 설정하고 좋은 오류 메시지를 추가하는 것 외에는 많은 일을 할 수 없습니다 (특히 호스트의 확인 된 주소를 인쇄하는 것). 더 강력한 재 시도를 추가하려면 모든 주소를 병렬로 시도하고 Java 플랫폼에서 이름 확인 캐싱 (양수 및 음수)을 조사합니다.