Java.Net.SocketTimeoutException: 接続タイムアウト
- Java のソケット
- Java でのタイムアウト
-
Java での
java.net.SocketTimeoutException: Connection timed out
の原因 -
Java での
java.net.SocketTimeoutException: Connection timed out
の解決策
今日の記事では、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
の原因
以下は、エラーの考えられる理由の一部です。
- サーバーは正常に動作しています。 ただし、
timeout
値はより短い時間に設定されます。 したがって、timeout
の値を増やしてください。 - リモート ホストで、指定されたポートがどのサービスによってリッスンされていません。
- 送信されているリモート ホストへのルートがありません。
- リモート ホストが接続を許可していないようです。
- リモート ホストへの到達に問題があります。
- 低速または利用できないインターネット接続。
Java での java.net.SocketTimeoutException: Connection timed out
の解決策
クライアントとサーバーのアクティビティの timeout
オプションを事前に設定できます。 try
および catch
コンストラクトを追加するのが適切な解決策です。
-
クライアント側で最初に行うことは、null
socket
を構築することです。 続いて、connect()
メソッドを使用し、タイムアウトが 0 ミリ秒より大きくなるようにtimeout
パラメータを設定します。関数が戻る前にタイムアウトになると、
SocketTimeoutException
がスローされます。Socket s = new Socket(); SocketAddress sAdres = new InetSocketAddress(host, port); s.connect(sAdres, 50000);
-
サーバー側から
timeout
値を設定したい場合は、setSoTimeout()
関数を使用できます。timeout
パラメータの値は、ServerSocket.accept()
関数がブロックする時間の長さを決定します。ServerSocket servers = new new ServerSocket(port); servers.setSoTimeout(10000);
同様に、
timeout
は 0 ミリ秒より大きくする必要があります。 メソッドが戻る前にtimeout
が期限切れになると、メソッドはSocketTimeoutException
を生成します。 -
接続タイムアウトを決定し、その後
try-catch
ブロックを使用してそれを処理することは、HttpException
を処理するもう 1つの優れた手法です。HttpUrlConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(8000);
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