HOWTO · Java

Java.Net.ConnectException: 연결 시간 초과

이 튜토리얼은 java.net.ConnectException: Java에서 Connection timed out에 대해 설명합니다.

이 페이지의 내용

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이 브라우저에서 열리지 않는 이유와 비슷합니다.

다음과 같은 원인일 수 있습니다.

  1. URL의 IP/도메인이 올바르지 않습니다.
  2. IP/도메인에 해당하는 서버가 다운되었습니다.
  3. 방화벽이 요청을 차단했거나 인터넷이 프록시 뒤에 있습니다.
  4. 서버가 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 오류를 피하기 위해 다음을 시도할 수 있습니다.

  1. setFixedLengthStreamingMode()를 통해 콘텐츠 길이를 설정합니다.
  2. 첫 번째 시도에서 URL 연결이 실패한 경우 연결을 재시도합니다.
  3. setConnectTimeout 기능을 사용하여 연결 제한을 더 높은 값으로 늘립니다.