ソケットを作成するとき:
Socket socket = new Socket(ipAddress, port);
IPアドレスが使用できないため、例外をスローしますが、これは問題ありません。 (String ipAddress = "192.168.0.3"
およびint port = 300
のテスト変数。)
問題は、どのようにそのソケットのタイムアウトに設定するのですか?
ソケットを作成するときに、UnknownHostException
を取得してソケットをタイムアウトさせるまでの時間を短縮するにはどうすればよいですか?
代わりに Socket()
コンストラクター 、および connect(SocketAddress endpoint, int timeout)
メソッド を使用してください。
あなたの場合、それは次のようになります:
Socket socket = new Socket();
socket.connect(new InetSocketAddress(ipAddress, port), 1000);
ドキュメントから引用
connect
public void connect(SocketAddress endpoint, int timeout) throws IOException
指定されたタイムアウト値でこのソケットをサーバーに接続します。ゼロのタイムアウトは、無限のタイムアウトとして解釈されます。接続は、確立されるかエラーが発生するまでブロックされます。
パラメータ:
endpoint
-SocketAddresstimeout
-ミリ秒単位で使用されるタイムアウト値。スロー:
IOException
-接続中にエラーが発生した場合SocketTimeoutException
-接続する前にタイムアウトが切れた場合IllegalBlockingModeException
-このソケットに関連付けられたチャネルがあり、チャネルが非ブロッキングモードの場合IllegalArgumentException
-エンドポイントがnullの場合、またはこのソケットでサポートされていないSocketAddressサブクラスの場合から:1.4
ソケットにタイムアウトを設定するのではなく、そのソケットで実行するoperationsにタイムアウトを設定します。
たとえば、socket.connect(otherAddress, timeout)
または、socket.setSoTimeout(timeout)
操作のタイムアウトを設定するためのread()
。
参照: http://docs.Oracle.com/javase/7/docs/api/Java/net/Socket.html
次のソリューションを使用できます。
SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);
それが役に立てば幸い!
UnknownHostException
が原因でタイムアウトを制御できません。これらはDNSタイミングです。有効なホストを指定した場合のみ、接続タイムアウトを制御できます。上記の回答のいずれも、この点に正しく対処していません。
しかし、ホスト名ではなくIPアドレスを指定すると、実際にUnknownHostException
を取得しているとは信じられません。
EDITJavaのDNSタイムアウトを制御するには この回答を参照 。
Socketに デフォルトのコンストラクター を使用し、次に connect()メソッド を使用します。