SocketChannel
を使用し、その読み取り/書き込みメソッドにタイムアウトを設定したいと考えています。次のように自分を所有するソケットのタイムアウトを設定しようとしましたSocketChannel
:
channel.socket().setSoTimeout(TIMEOUT);
しかし、それはうまくいきません。他の解決策はありますか?
SocketChannel
を使用し、その読み取り/書き込みメソッドにタイムアウトを設定したいと考えています。次のように自分を所有するソケットのタイムアウトを設定しようとしましたSocketChannel
:
channel.socket().setSoTimeout(TIMEOUT);
しかし、それはうまくいきません。他の解決策はありますか?
この記事によると、SocketChannelは読み取り操作のタイムアウトにはなりませんが、別の方法でチャネルから読み取ることでこの効果を得ることができます。
SocketChannel socketChannel;
socketChannel.socket().setSocketTimeout(500);
InputStream inStream = socketChannel.socket().getInputStream();
ReadableByteChannel wrappedChannel = Channels.newChannel(inStream);
ラップされたチャネルからの読み取りは、設定したsocketTimeOutに従ってタイムアウトになります。
Java セレクターの使用に慣れている場合は、セレクターを使用して自分でソケット タイムアウトをエミュレートできます。sun.nio.ch.SocketAdaptor を見ると役に立ちます。
Thread.interrupt() の使用には注意が必要です。SocketChannel は InterruptibleChannel です。InterruptibleChannel の説明を読むと、Thread.interrupt() によって SocketChannel が閉じられます。タイムアウト後に SocketChannel を使用する場合、InterruptibleChannel 機能は使用できません。
また、チャンネルをブロック不可にして、System.currentTimeMillis()を使用することも検討できます。