2013-12-23 11 views
5

JDK 1.7 APIを参照してください。 AsynchonousSocketChannelで接続タイムアウトを設定することができないようです。とにかく私はこのようなチャンネルで接続タイムアウトを設定できますか?Java NIO AsynchronousSocketChannelの接続タイムアウトの設定方法

ありがとうございました。

+1

タイムアウトはブロック操作用です。これは非同期操作です。質問は意味をなさない。 – EJP

+0

@EJP - 操作が非同期であっても、ソケットを接続するために永遠に待つことを望まないという観点からしています。つまり、Cでも、やりにくいです。非ブロックモードのソケットでは、 'select()'とタイムアウトを併用する必要があります。私は実際にNIO2でそれをどうやって行うのかを理解するために掘り下げなければなりません。それがどのようにあなたから離れて抽象化されているかを考えれば、それは可能ではないかもしれません。 –

+0

@Brian「永遠に待っている」ことはありません。デフォルトの接続タイムアウトは、プラットフォームに依存します。私はブロッキングモードとノンブロッキングモードでこれを行う方法を認識しています。ありがとうございます。あなたの答えは、既存のJava APIを使って非同期モードにすることはできません。彼らは、 'CompletionHandler'が以前に呼び出されるように、connectメソッドにタイムアウトパラメータを与えておくべきです(何らかのレベルで何らかのテクニックを使うと、接続タイムアウトを減らし、増やすことはできません)。 – EJP

答えて

5

答えは:できません。

最初に理解しなければならないのは、TCP接続の仕組みです。カーネルはSYNパケットを送信し、各再試行間の時間をバックアップします。これは、カーネルパラメータを介して調整することができます。 (Linux用)詳細にこれをカバーする記事はあなたのソケット用に独自の短いタイムアウトを実装するのに関与何のアイデアを与えるために

hereを見つけることができ、ノンブロッキングモードでソケットを入れて、それをスローするようにされた接続a select()にタイムアウトがある場合は、getsockopt()を使用して何が起こったかを確認してください。 This StackOverflow answerは、これがどのように機能するかを示しています。

NIO.2では、アクセス権のないスレッドを使用して接続処理が処理されます。残念ながら、接続のタイムアウトを短くしたいと言う方法はありません。完了ハンドラを呼び出すか、接続が失敗したとき(タイムアウトを含む)に成功したときにFutureに通知します。

あなたはそれがタイムアウトするならば、Futureをキャンセルし、返さFutureget(timeout, unit)を呼び出すためのオプションを持っている...しかし、それはあなたが接続になりたい場合は、スレッド/コールバックの別の層を追加する必要が非同期(async)を意味し、 nioであなた自身の非同期なことを実装するだけかもしれません。あなたは非同期ネットワークのものを見ているので、言及する価値

最後に一つはNettyは(Ni​​Oとを使用して)あなたにこれを与えるないことである:

Bootstrap bootstrap = new Bootstrap() 
      .group(new NioEventLoopGroup()) 
      .channel(NioSocketChannel.class) 
      .remoteAddress(new InetSocketAddress(remoteAddress, port)) 
      .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connectionTimeout); 

ChannelFuture f = bootstrap.connect(); 

そして、あなたは、コールバックのためにそのChannelFutureでリスナーを登録することができます。

関連する問題