-1

セレクターが機能しない理由を見つけようとしています。コードは次のとおりです。

//SocketChannel ch
//java.nio.channels.Selector impl
//Object session
SelectionKey sk = ch.register(impl, 0x01, session);
int i = impl.select();
System.out.println(i);

印刷される値はゼロです。これは、プログラム内の SocketChannel.register の唯一の呼び出しであるため、私が理解している限りでは、
a) 登録中に 1 つの新しい SelectionKey を作成する必要があります。
b) したがって、選択中に 1 つのキーの「ready-operation set」を更新する必要があります。つまり、このメソッドは 1 を返す必要があります。

期待どおりに動作しないのはなぜですか? 「誰の準備完了セットが更新されたか」とは正確にはどういう意味ですか?

4

1 に答える 1

1

使用している用語の意味を理解していないようです。「準備完了」とは、「ブロックせずに I/O 操作を実行する準備ができている」ことを意味します。たとえば、OP_READ が準備完了であることは、read() が、読み取られたバイト数を示す正の整数、またはストリームの終わりを示す -1 を返すことを意味します。具体的には、読み取り可能なデータがないことを示すゼロを返しません。

select() が選択されたキーを返す必要があることを証明するコードは何もありません。ピアからの外部イベントのみがそれを引き起こす可能性があり、それについては何も言っていません。

注意: マジック ナンバー 0x01 は使用しないでください。選択イベントにはマニフェスト定数があります: SelectionKey.OP_READ とその仲間です。それらを使用します。

于 2013-05-12T02:18:46.377 に答える