web-dev-qa-db-ja.com

ソケット操作のタイムアウトの設定

ソケットを作成するとき:

Socket socket = new Socket(ipAddress, port);

IPアドレスが使用できないため、例外をスローしますが、これは問題ありません。 (String ipAddress = "192.168.0.3"およびint port = 300のテスト変数。)

問題は、どのようにそのソケットのタイムアウトに設定するのですか?

ソケットを作成するときに、UnknownHostExceptionを取得してソケットをタイムアウトさせるまでの時間を短縮するにはどうすればよいですか?

82
Jennifer

代わりに 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-SocketAddress
timeout-ミリ秒単位で使用されるタイムアウト値。

スロー:

IOException-接続中にエラーが発生した場合
SocketTimeoutException-接続する前にタイムアウトが切れた場合
IllegalBlockingModeException-このソケットに関連付けられたチャネルがあり、チャネルが非ブロッキングモードの場合
IllegalArgumentException-エンドポイントがnullの場合、またはこのソケットでサポートされていないSocketAddressサブクラスの場合

から:1.4

155
aioobe

ソケットにタイムアウトを設定するのではなく、そのソケットで実行するoperationsにタイムアウトを設定します。

たとえば、socket.connect(otherAddress, timeout)

または、socket.setSoTimeout(timeout)操作のタイムアウトを設定するためのread()

参照: http://docs.Oracle.com/javase/7/docs/api/Java/net/Socket.html

41
payne

次のソリューションを使用できます。

SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create your socket
Socket socket = new Socket();
// Connect with 10 s timeout
socket.connect(sockaddr, 10000);

それが役に立てば幸い!

18
reef

UnknownHostExceptionが原因でタイムアウトを制御できません。これらはDNSタイミングです。有効なホストを指定した場合のみ、接続タイムアウトを制御できます。上記の回答のいずれも、この点に正しく対処していません。

しかし、ホスト名ではなくIPアドレスを指定すると、実際にUnknownHostExceptionを取得しているとは信じられません。

EDITJavaのDNSタイムアウトを制御するには この回答を参照

8
user207421

Socketに デフォルトのコンストラクター を使用し、次に connect()メソッド を使用します。

5
Sjoerd