3

私はセレクターなどを使用していません。私は単純なServerSocketChannelリスニングとSocketChannelブロッキングモードでの接続を持っています。接続にタイムアウトを課したいのですが、うまくいきSocketChannel.socket().setSoTimeout()ません。

バックグラウンド スレッドを 30 秒間スリープさせ、変数がまだあるかどうかを確認しようとしましたがnull(その変数への読み取りを待機するのをブロックするため)、匿名のローカル変数にアクセスできなかったため、変数を適切に同期できませんでしたクラス。

これを達成する他の方法はありますか?

更新:質問の言い方が間違っています。また、接続自体だけでなく、読み取り操作にもタイムアウトを設定したいと考えています。

4

2 に答える 2

2

setSoTimeout()接続タイムアウトではなく読み取りタイムアウトを設定します。何らかの理由でSocketChannels、ブロック モードでも、ラップされたストリームでもまったく機能しません。

あなたが探しているメソッドはchannel.socket().connect()、2 つの引数を持っています。

于 2013-02-27T21:18:33.700 に答える
-1

私の知る限り、これは で同期操作を使用することはできませんnio。ソケットのタイムアウトを介して設定するSocket.setSoTimeout()と、読み取りと書き込みに影響しますが、接続は確立されません。

システム ライブラリ レベルであっても、接続のタイムアウトは読み取り/書き込みタイムアウトとは異なります。詳細についてはman 2 connectman 2 setsockoptおよびman 7 socketを参照してください。したがって、接続時に実際のアプリケーション制御のタイムアウトが必要な場合は、非同期接続プロトコルと適切なSelector、 checkなどを使用する必要がありますSelectionKey.isConnectable()。残念ながら、これによりコードがかなり長くなります。

Java lib のソースは手元にありませんが、 が内部でどのようSocket.connect(SocketAddress endpoint,int timeout)に実装されているかを調べるのは興味深いことですがselect()、内部でも使用されていると思います。

于 2013-02-27T21:19:23.917 に答える