1. ホーム
  2. java

ソケットとSocketChannelの比較

2023-10-18 10:58:25

疑問点

私は、以下のことを理解しようとしています。 ソケットチャンネル NIO を一般的に使用することができます。私は、通常のソケットで作業する方法と、(通常のブロッキングソケットを使用して)クライアントごとの簡単なスレッドサーバーを作成する方法を知っています。

だから私の質問。

  • SocketChannelとは何ですか?
  • Socketの代わりにSocketChannelを使用する場合、どのような利点がありますか。
  • チャネルとバッファの関係はどうなっていますか。
  • セレクタとは何ですか?
  • の最初のセンテンスは ドキュメント A selectable channel for stream-oriented connecting sockets. . というのはどういう意味でしょうか?

を読みました。 このドキュメント を読みましたが、どういうわけか理解できません...。

どのように解決するのですか?

A Socket はブロッキング入出力デバイスです。これによって Thread を読み込み時にブロックさせ、バッファが一杯になると書き込み時にもブロックさせる可能性があります。そのため、もしサーバーにたくさんのオープンな Socket s.

A SocketChannel はソケットから読み込むためのノンブロッキングな方法で、 1つのスレッドが一度にたくさんのオープンなコネクションと通信できるようにします。この機能は SocketChannelSelector に変換し、セレクタの select() メソッドをループさせ、ソケットが受け入れられたり、データを受け取ったり、 あるいは閉じたりした場合にそれを通知することができます。これにより、1つのスレッドで複数のクライアントと通信でき、複数のスレッドや同期のオーバーヘッドが発生することはありません。

Buffer はNIOのもう一つの機能で、読み取りと書き込みから基礎データにアクセスし、データを新しい配列にコピーするオーバーヘッドを回避することができます。