1

次のようにコーディングすると:

ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress sa = new InetSocketAddress("localhost",8888);
ssc.socket().bind(sa);
ssc.configureBlocking(false);
ssc.socket().accept();

メソッドはServerSocket.accept()をスローしjava.nio.channels.IllegalBlockingModeExceptionます。accept()ブロッキングを に設定しているのに、を呼び出せないのはなぜfalseですか?

4

3 に答える 3

3

ssc.socket().accept()問題は、 ではなくを呼び出していることですssc.accept()。最後の行をssc.accept()then に変更すると、期待どおりに動作します。待機中の場合は SocketChannel を返し、そうでない場合は null を返します。

于 2009-02-13T15:49:52.963 に答える
2

それがserversocket.accept()のjavadocが言っていることだからですか?

IllegalBlockingModeException - このソケットに関連付けられたチャネルがあり、チャネルが非ブロッキング モードの場合。

于 2008-11-30T15:12:12.660 に答える
2

Javadoc は具体的に次のように述べていServerSocketChannel.accept()ます。

このチャネルのソケットへの接続を受け入れます。

このチャネルが非ブロッキング モードの場合、保留中の接続がなければ、このメソッドはすぐに null を返します。そうしないと、新しい接続が利用可能になるか、I/O エラーが発生するまで、無期限にブロックされます。

一般的な考え方は次のとおりです。

  • 着信接続の待機中にブロックする場合は、サーバー ソケットをブロック モードのままにします。接続が実際に入るまで何もしないサーバーを作成している場合は、ブロッキングモードが必要です。
  • 他のことをしたい場合、および保留中の接続があるかどうかを定期的に確認する場合は、非ブロック モードが必要です。

ブロッキング モードがデフォルトになっているのには理由があります。ほとんどのサーバーは、着信接続を受け入れるソケットをポーリングしたくありません。

于 2009-01-10T18:37:44.700 に答える