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

Muhammad Zeeshan 2023年10月12日
  1. Java のソケット
  2. Java でのタイムアウト
  3. Java での java.net.SocketTimeoutException: Connection timed out の原因
  4. Java での java.net.SocketTimeoutException: Connection timed out の解決策
Java.Net.SocketTimeoutException: 接続タイムアウト

今日の記事では、java.net.SocketTimeoutException: Connection timed outについて説明します。 しかし、最初に、ソケットとタイムアウトの概念を詳しく見てみましょう。

Java のソケット

2つのコンピューター アプリケーション間の論理リンクには複数のエンドポイントがあり、そのうちの 1つがソケットです。

別の言い方をすれば、アプリケーションがネットワーク上でデータを送受信するために使用する論理インターフェイスです。 IP アドレスとポート番号は、最も基本的な形式のソケットを構成します。

各ソケットには固有のポート番号が割り当てられており、これを利用してサービスを識別します。 接続ベースのサービスは、TCP に基づくストリーム ソケットを使用します。

このため、Java はクライアント側のプログラミング オプションとして java.net.Socket クラスを提供します。

一方、java.net.ServerSocket クラスは、サーバー側の TCP/IP プログラミングで使用されます。 UDP に基づくデータグラム ソケットは別の種類のソケットで、コネクションレス サービスに使用されます。

Java は、UDP 操作用の java.net.DatagramSocket をサポートしています。

Java でのタイムアウト

socket コンストラクターが呼び出されると、socket オブジェクトのインスタンスが作成され、クライアント側からクライアントとサーバー間の接続が可能になります。

入力として、コンストラクターはリモート ホストのアドレスとポート番号を受け取ることを想定しています。 その後、提供されたパラメーターを使用して、リモート ホストへの接続を確立しようとします。

この操作により、接続が正常に作成されるまで、他のプロセスが続行されなくなります。 ただし、指定された時間が経過しても接続が成功しない場合、アプリケーションは次のエラーをスローします。

java.net.SocketTimeoutException : Connection timed out

着信接続要求をリッスンすると、サーバー側の ServerSocket クラスが永続的にアクティブになります。 ServerSocket が接続要求を受信すると、accept 関数が呼び出されて新しい socket オブジェクトが作成されます。

前の方法と同様に、これはリモート クライアントが接続されるまでブロックします。

Java での java.net.SocketTimeoutException: Connection timed out の原因

以下は、エラーの考えられる理由の一部です。

  1. サーバーは正常に動作しています。 ただし、timeout 値はより短い時間に設定されます。 したがって、timeout の値を増やしてください。
  2. リモート ホストで、指定されたポートがどのサービスによってリッスンされていません。
  3. 送信されているリモート ホストへのルートがありません。
  4. リモート ホストが接続を許可していないようです。
  5. リモート ホストへの到達に問題があります。
  6. 低速または利用できないインターネット接続。

Java での java.net.SocketTimeoutException: Connection timed out の解決策

クライアントとサーバーのアクティビティの timeout オプションを事前に設定できます。 try および catch コンストラクトを追加するのが適切な解決策です。

  1. クライアント側で最初に行うことは、null socket を構築することです。 続いて、connect() メソッドを使用し、タイムアウトが 0 ミリ秒より大きくなるように timeout パラメータを設定します。

    関数が戻る前にタイムアウトになると、SocketTimeoutException がスローされます。

    Socket s = new Socket();
    SocketAddress sAdres = new InetSocketAddress(host, port);
    s.connect(sAdres, 50000);
    
  2. サーバー側から timeout 値を設定したい場合は、setSoTimeout() 関数を使用できます。 timeout パラメータの値は、ServerSocket.accept() 関数がブロックする時間の長さを決定します。

    ServerSocket servers = new new ServerSocket(port);
    servers.setSoTimeout(10000);
    

    同様に、timeout は 0 ミリ秒より大きくする必要があります。 メソッドが戻る前に timeout が期限切れになると、メソッドは SocketTimeoutException を生成します。

  3. 接続タイムアウトを決定し、その後 try-catch ブロックを使用してそれを処理することは、HttpException を処理するもう 1つの優れた手法です。

    HttpUrlConnection conn = (HttpURLConnection) url.openConnection();
    conn.setConnectTimeout(8000);
    
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

関連記事 - Java Error