Java.Net.ConnectException: 接続タイムアウト

Shuvayan Ghosh Dastidar 2023年10月12日
  1. Java で java.net を使用してネットワーク呼び出しを行う
  2. Java の java.net パッケージのエラー
Java.Net.ConnectException: 接続タイムアウト

java.net パッケージには、インターネット上の任意のサーバーとの接続に使用できる多くの関数が含まれているため、GETPOST などの残りの呼び出しに使用できます。

このチュートリアルでは、このパッケージを使用して基本的なネットワーク呼び出しを行い、直面して解決できるエラーに焦点を当てます。

Java で java.net を使用してネットワーク呼び出しを行う

ネットワーク呼び出しを行うことは、Java 開発者が日常的に直面する最も重要なことの 1つです。 ネットワーク呼び出しを正しく行うと、アプリケーションがより堅牢になり、ユーザー エクスペリエンスが向上します。

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 でネットワーク呼び出しを行う際に、Connection Timed Out 問題が発生する場合があります。 これらの問題を修正することは、ブラウザーで特定の 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 関数を使用して、接続制限をより高い値に増やします。
Shuvayan Ghosh Dastidar avatar Shuvayan Ghosh Dastidar avatar

Shuvayan is a professional software developer with an avid interest in all kinds of technology and programming languages. He loves all kinds of problem solving and writing about his experiences.

LinkedIn Website

関連記事 - Java Exception