はじめに
『Javaによる簡易HTTPサーバーの作成』第4回目の今回は、クライアントとの通信に、これまで利用してきたSocketではなく、NIOで提供されるSocketChannelを利用します。
Socketでは、実際の入出力にはStreamを利用します。この時、例えばInputStream#read
を呼び出すと、データが読み込み可能になるか例外になるまではread
メソッドから制御が戻りません。そのため、同時に複数のクライアントからの要求を処理するためには、クライアントごとにスレッドを利用する必要がありました。
これに対して、SocketChannelを非ブロックモードで利用すると、まだデータが到達していない、あるいはシステムの送信用バッファがフルになっているなどの理由でデータを転送できない時には、制御が呼び出し側に戻されます(これをJ2SEのAPIドキュメントでは「非ブロック接続」と呼んでいます)。この特性を利用して同時に複数のIOを少しずつ処理することで、シングルスレッドでも同時に複数のクライアント接続を処理できるようになります。
本記事では、
- 非ブロック接続の利用方法
- NIOでread/writeに利用する
Buffer
オブジェクトの利用方法
について、コードを示しながら解説します。
対象読者
本記事は、Javaプログラミングの中級者を対象に、J2SEのNIOの利用方法を解説します。
NIOを利用すると、単一のスレッドで複数のクライアントからのリクエストを効率的に処理できるようになります。
必要な環境
本記事のソースをビルド/実行するには、J2SE 5.0以上を利用してください。ソースファイルアーカイブは、直接NetBeans 5.0のプロジェクトとして開けるように構成してありますが、NetBeans 5.0を利用しなくても、コマンドラインからJDKおよびAntを利用してビルドできるように構成してあります。
なお、ソースファイルアーカイブは、あらかじめJ2SE 5.0でビルドしたクラスファイルとjarを含んでいます。そのため、JREがあれば実行することが可能です。
参考までに、筆者が利用した本記事のテスト環境は次のとおりです。
OS | J2SE | Ant | JUnit | IDE | ブラウザ |
OS X | 1.5.0_05 | 1.6.2 | 3.8.1 | NetBeans5.0J | Safari |
Windows XP | 1.5.0_06 | 1.6.2 | 3.8.1 | NetBeans5.0J | Firefox 1.0.7/IE6SP2 |
NetBeans 5.0からの利用
メニューから[ファイル]-[プロジェクトを開く]を順に選択し、ソースファイルアーカイブを展開したディレクトリの「httpserver」ディレクトリを選択して、[プロジェクトフォルダを開く]をクリックしてください。
プロジェクトが読み込まれたら、プロジェクトのコンテキストメニュー(ショートカットメニュー)から[プロパティ]をクリックし、[プロジェクトプロパティ]の[プロジェクトの実行]タブを選択して、[作業用ディレクトリ]に展開したディレクトリの「httpserver\html」を設定してください。
以降、プロジェクトのコンテキストメニューから実行、デバッグ、テスト実行が可能となります。