Java.Net.ConnectException: 연결 시간 초과
java.net
패키지에는 인터넷의 모든 서버와 연결하는 데 사용할 수 있는 많은 기능이 있으므로 GET
또는 POST
와 같은 나머지 호출을 만드는 데 사용할 수 있습니다.
이 자습서에서는 이 패키지를 사용하여 기본 네트워크 호출을 수행하고 직면하고 해결할 수 있는 오류에 중점을 둘 것입니다.
Java에서 java.net
으로 네트워크 호출하기
네트워크 호출을 만드는 것은 Java 개발자가 매일 직면하는 가장 중요한 일 중 하나입니다. 네트워크 호출을 올바르게 수행하면 애플리케이션이 더욱 강력해지고 우수한 사용자 경험을 제공할 수 있습니다.
java.net
패키지에는 네트워크 호출과 관련된 많은 기능이 있습니다.
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
class Main {
public static void main(String args[]) throws Exception {
HttpURLConnection.setFollowRedirects(true); // Defaults to true
String url = "https://www.delftstack.com/howto/java/";
URL request_url = new URL(url);
HttpURLConnection http_conn = (HttpURLConnection) request_url.openConnection();
http_conn.setConnectTimeout(100000);
http_conn.setReadTimeout(100000);
http_conn.setInstanceFollowRedirects(true);
System.out.println(String.valueOf(http_conn.getResponseCode()));
}
}
위의 코드 세그먼트는 url
변수에 GET
요청을 한 다음 연결을 엽니다. 모든 것이 작동하면 응답 코드 200
을 출력합니다.
그러나 너무 많이 시도하면 서버 연결에 실패하고 IOException
이 발생할 수 있습니다.
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
class Main {
public static void main(String args[]) throws Exception {
URL url = new URL("https://reqres.in/api/users");
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestMethod("POST");
http.setDoOutput(true);
http.setRequestProperty("Content-Type", "application/json");
http.setRequestProperty("Content-Length", "0");
String body = "{\"name\": \"morpheus\",\"job\": \"leader\"}";
http.getOutputStream().write(body.getBytes("UTF8"));
System.out.println(http.getResponseCode() + " " + http.getResponseMessage());
http.disconnect();
}
}
위의 코드 세그먼트는 샘플 REST API 서버에 POST
요청을 만들고 응답을 반환합니다.
Java의 java.net
패키지 오류
Java에서 네트워크 호출을 수행하는 동안 연결 시간 초과
문제가 발생할 수 있습니다. 이러한 문제를 해결하는 것은 때때로 특정 URL이 브라우저에서 열리지 않는 이유와 비슷합니다.
다음과 같은 원인일 수 있습니다.
- URL의 IP/도메인이 올바르지 않습니다.
- IP/도메인에 해당하는 서버가 다운되었습니다.
- 방화벽이 요청을 차단했거나 인터넷이 프록시 뒤에 있습니다.
- 서버가 IP를 차단 목록에 포함했을 수 있습니다.
예를 들어:
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
class Main {
public static void main(String args[]) throws Exception {
URLConnection urlConnection = null;
OutputStream outputStream = null;
URL url = new URL("http://google.com");
urlConnection = url.openConnection();
urlConnection.setConnectTimeout(1);
}
}
출력:
Exception in thread "main" java.net.SocketTimeoutException: Connect timed out
at java.base/java.net.Socket.connect(Socket.java:648)
at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:177)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569)
at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
...
따라서 위의 예외는 소켓 또는 URL에 대한 적절한 연결을 열 수 없고 포트 조합 또는 시간 초과가 URL에 연결하기에 충분하지 않은 경우 발생합니다. 이 경우 urlConnection.setConnectTimeout(1);
.
Java에서 Connection Timed Out
오류를 피하기 위해 다음을 시도할 수 있습니다.
setFixedLengthStreamingMode()
를 통해 콘텐츠 길이를 설정합니다.- 첫 번째 시도에서 URL 연결이 실패한 경우 연결을 재시도합니다.
setConnectTimeout
기능을 사용하여 연결 제한을 더 높은 값으로 늘립니다.