2012-09-09 8 views
8

Java NIOでは、ServerSocketChannelにセレクタが必要な理由を簡単に理解できます。セレクタは、I/O操作の準備ができている複数のクライアントチャネルの中からチェックできます。Java NIOでは、クライアントのSocketChannelに便利なセレクタですか?

しかし、私がウェブで読んだ解説では、セレクタメカニズムがクライアントSocketChannelに適用されています。セレクタがクライアントに使用される理由はわかりません。誰もがなぜ1つのサーバーしかない通常の状況で使用されるのか説明できますか?

+0

たとえば、ページの下部にあるhttp://tutorials.jenkov.com/java-nio/socket-channel.htmlは、セレクタとSocketChannelsの推奨事項です。 – Arvanem

+0

しかし、彼はクライアントのためにそれのいずれかをお勧めしません。このチュートリアルには、多くの悪いアドバイスがあります。たとえば、ノンブロッキングモードでのループです。より良いものを見つける。 – EJP

+0

@EJPはお試しいただきます、ありがとうございます。 – Arvanem

答えて

6

何百ものサーバーに接続している場合を除き、ノンブロッキングNIOのポイントをクライアントで見るのは難しいです。しかし、ノンブロッキングNIOを使用している場合、間違いなくSelectorを使用する必要があります。そうでなければ、いつチャンネルを読むか、または不完全な書き込み後に再び書き込み可能になるかどうかを知ることができません。

5

セレクタを使用すると、1つのスレッドを使用して複数のチャネルで同時通信を処理できます。複数のサーバーと同時に通信する必要がある場合や、トレントを読むときなど、クライアントの役割でピアコンピューターと通信する場合に、クライアント上で役立つ場合があります。

+0

ありがとうございました。また、クライアントとサーバーの間でSelectionKeysを相互に交換するために、セレクタが必要であることを明らかにしたいと思います。あなたは賛成ですか、反対ですか? – Arvanem

+0

@Arvanem 2つのスレッドを使って同じことをすることができるので、それらが「必要」であるとは言いません。セレクタは便利です。並列タスクに対処するためのシングルスレッドコードを書くことができます。 – dasblinkenlight

+0

しかし、サーバソケットチャンネルがセレクタを使用している場合は必要ですか? SelectionKeyを起動してサーバーに戻すことができるセレクターとは別の方法はないからです。 – Arvanem

関連する問題