*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*

C#> 簡易Webサーバー作成の基礎 No.3

 --- 受け付け処理の繰り返しを対応(暫定版)

*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*


「C# にて、簡易Webサーバーを作成」

における一連の説明(知恵ノート)において、ここでは、


「簡易Webサーバー作成の基礎 No.3

 --- 受け付け処理の繰り返しを対応(暫定版)」 


について説明します。






総合の目次


本ページを含めた関連事項の総合目次です。

http://note.chiebukuro.yahoo.co.jp/detail/n317268



関連サンプル


本サンプルと関連性のあるサンプルです。
すなわち、前回までと次回以降のサンプルです。

関連サンプル <ステップ1「簡易Webサーバー作成における基礎的ソースコード」
http://note.chiebukuro.yahoo.co.jp/detail/n316862

関連サンプル <ステップ2>「簡易Webサーバー作成の基礎 No.2 --- 複数のURIプレフィックス指定の対応」
http://note.chiebukuro.yahoo.co.jp/detail/n316863

関連サンプル <ステップ3>「簡易Webサーバー作成の基礎 No.3 --- 受け付け処理の繰り返しを対応(暫定版)」

今回のサンプルです。

関連サンプル <ステップ4その他の関連サンプル
ステップ3より後のサンプルプログラムは、存在します。ステップ4以降のサンプルは、総合目次から参照して下さい。




 はじめに


ここでは、Visual C# の HttpListenerクラス等で、基礎的なWebサーバー(簡易Webサーバー)を作成する方法について解説します。ただし、簡易Webサーバー作成関連の比較的最初(3回目)のサンプルですので、ソースコードをなるべく単純にしています。なお、前回サンプル(2回目)に対して、今回は、以下の処理が付け加えられています。すなわち、以下に説明します「受け付け処理の繰り返し」が付け加えられています。

 受け付け処理の繰り返しについて


ところで、今までのサンプルでは、クライアントからの接続があれば、その要求の処理が終わり次第、プログラム(簡易Webサーバー)を終了していました。すなわち、受け付け処理は、1回だけしか対応していません。よって、2回目以降の受け付けを行ないたい場合は、サーバープログラム(簡易Webサーバー)を起動し直す必要がありました。そこで、本サンプルでは、受け付け処理を繰り返し行なうように改善しています。具体的には、受け付け処理のコード部分を、ループで繰り返し行なう仕様にしてあります。ただし、受け付けを繰り返し処理(ループ処理)にした場合は、ある問題が発生します。その問題点については、下記の「受け付けを繰り返し処理にした場合の問題点」を参照して下さい。

 受け付けを繰り返し処理にした場合の問題点


前述しました通り、今回のサンプルでは、クライアントからの受信受け付けをする部分は、無限ループになります。しかし、無限ループは、処理を占有してしまうので、プログラム全体が動作しなくなります。すなわち、プログラムが固まった状態、つまり、何の操作も受け付けない状態になります。ただし、「何も受け付けない」と言いましても、クライアントからの受信処理は、正常に動作します。クライアントからの受け付け処理をループにしているのですから、正常に動作するほうが、当たり前です。なお、ここで、「何も受け付けない」と言っていますのは、受信受け付け以外の処理のことです。例えば、本件のプログラム(簡易Webサーバー)を終了したい場合は、上記の無限ループを終了させる信号を送るとよいです。しかし、前述の通り、受信受け付け以外の処理は、何も受け付けません。よって、ループ終了の信号も受け付けません。すなわち、プログラム(簡易Webサーバー)を終了する方法はなく、いつまでも作動を続けます。



処理占有に対する対策について


処理占有に対しては、改善策があります。マルチスレッドと言う技法を使えば、処理占有の問題が解決します。ただし、今回のサンプルでは、マルチスレッドでの改善は、行ないません。マルチスレッドは、次回のサンプルで行なう予定です。すなわち、今回のサンプルは、マルチスレッド化の前段階となる、準備のサンプルとなります。なお、今での説明(上記理由)の通り、本サンプルプログラム(簡易Webサーバー)を終了する方法はなく、いつまでも作動を続けます。よって、本サンプルは、デバッグで開始して、終了時は、[デバッグ] - [すべて中止] で強制終了して下さい。




 関連サンプルと比べた特徴


関連サンプルと比べた特徴は、以下の通りです。

関連サンプル <ステップ1「簡易Webサーバー作成における基礎的ソースコード」
簡易Webサーバー作成関連の最初のサンプルですので、ソースコードをなるべく単純にしています。次ステップ(ステップ2)と、それ以降の関連サンプルで、少しづつ必要な処理を付け加えて行きます

関連サンプル <ステップ2>「簡易Webサーバー作成の基礎 No.2 --- 複数のURIプレフィックス指定の対応」
前述の通り、本ステップ(ステップ2)と、それ以降の関連サンプルで、少しづつ必要な処理を付け加えて行きます。本ステップ(ステップ2)のサンプルは、前ステップ(ステップ1)に比べて、以下の処理が付け加えられています。まず、本ステップ(ステップ2)のサンプルは、URIプレフィックスを複数個指定することが可能になっています(前ステップは、1個のみの指定)。また、幾つかのエラー処理が行なわれています

関連サンプル <ステップ「簡易Webサーバー作成の基礎 No.3 --- 受け付け処理の繰り返しを対応(暫定版)」
前ステップ(ステップ2)までのサンプルでは、クライアントからの接続があれば、その要求の処理が終わり次第、プログラム(簡易Webサーバー)を終了していました。すなわち、受け付け処理は、1回だけしか対応していません。しかし、本ステップ(ステップ3)のサンプルでは、受け付け処理を繰り返し行なうように改善しています。

関連サンプル <ステップ4>その他の関連サンプル
ステップ1からステップ3までの関連サンプルは、ソースコードをなるべく単純にしています。よって、実用性が欠けています。これに対して、ステップ4と、それ以降のサンプルでは、実用性のあるサンプルとしています。詳しくは、総合目次から参照して下さい



 サンプルコード


ここで取り上げるサンプルは、なるべく複雑にならない範囲で、簡易Webサーバーを確かめられるものとします。

 本サンプルの仕様概要





<ドキュメントルートやURI プレフィックス等の仕様>本サンプル(簡易Webサーバー)で管理するHTMLファイルは、
C:wwwrootSUB1HTMLSample1.html

C:wwwrootSUB2HTMLSample2.html
とします。ドキュメントルートの指定は、
C:wwwroot
とします。URI プレフィックスの指定は、
http://localhost/SUB1/

http://localhost/SUB2/
とします。Webブラウザ(クライアント)でのURLの指定は、
http://localhost/SUB1/HTMLSample1.html
又は、
http://localhost/SUB2/HTMLSample2.html
とします。なお、クライアント(Webブラウザ)は、サーバー(本プログラム)と同じマシン上にあるものとします。異なるマシンの場合のURL指定は、上記の localhost の箇所は、IPアドレス、又はマシン名で指定して下さい。

<操作上の仕様>ボタンは、「サーバー開始」ボタンと「サーバー終了」ボタンと言う2個のボタンを用意しています。「サーバー開始」ボタンを押すと、受信の受け付け処理が開始します(すなわち、「サーバー開始」ボタンを押すと、受信受け付けの無限ループが、動作開始となります)。「サーバー終了」ボタンを押せば、受信の受け付け処理が終了します(すなわち、「サーバー終了」ボタンを押すと、受信受け付けの無限ループは終了します)。上記のサーバー開始の状態で、クライアントから電文(要求URL)が送られてきたら、その電文の内容のHTMLファイルをクライアントへ返信します。

 フォームデザイン等の前準備


コードを記述する前に、フォームのデザイン作成などの、以下の前準備を行なって下さい。

<プロジェクトの作成>本サンプルの確認用に、新規にプロジェクトを作成して下さい。プロジェクトの種類は、「Windowsフォームアプリケーション」です。

<フォームのデザイン>デザイン画面で、Label(ラベル)を1個と、ボタン(button)を1個貼り付けて下さい。


 デザイン画面.jpg



<イベントプロシージャの作成>また、デザイン画面のフォーム(ボタンやテキストボックスが貼り付いていない無地の部分)をダブルクリックすることにより、Form1_Load() メソッドを作って下さい。次に、デザイン画面のフォームが選択された状態で、「プロパティ」画面の「イベント」ボタン(雷マークのボタン)をクリックして下さい。その「プロパティ」画面で、FormClosed と言う項目をダブルクリックして下さい。そうすると、Form1_FormClosed()メソッドが作成されます。次に、先ほど貼り付けたボタン1(button1)をダブルクリックして、button1_Click() メソッドを作って下さい。同様にボタン「button2」もダブルクリックして、button2_Click() メソッド を作って下さい。

<クラスを書くためのソースファイルの作成>[プロジェクト] - [クラスの追加] で、「新しい項目の追加」画面を表示する。その画面の [ファイル名]欄に任意のファイル名(クラス用ソースファイルのファイル名)を記入する。[追加]ボタンをクリックする。なお、ここで作成されたソースファイルには、後述しますクラスのコード(「簡易Webサーバークラスのソースコード」等)を記述します。

<その他の準備事項>その他には、後述します「実行前の準備事項」の準備を行なって下さい。

 ソースコード


<Form1クラスのソースコード>
http://note.chiebukuro.yahoo.co.jp/detail/n322014

<簡易Webサーバークラスのソースコード>
http://note.chiebukuro.yahoo.co.jp/detail/n322015

記述量上限の制限で、ページを分けて記述しています。


 コードの解説


サンプルコードの中に書かれていますコメントを読んで下さい。すなわち、コードの解説は、基本的にサンプルコードの中に書かれているコメントとします。

 実行前の準備事項



<HTMLファイル格納用フォルダとHTMLファイルの用意>
「本サンプルの仕様概要」で述べました通り、本サンプル(簡易Webサーバー)で管理するHTMLファイルは、
C:wwwrootSUB1HTMLSample1.html

C:wwwrootSUB2HTMLSample2.html
とします。よって、
C:wwwrootSUB1

C:wwwrootSUB2
と言うフォルダをあらかじめ用意する必要があります。また、その各フォルダの中に、HTMLSample1.html と HTMLSample2.html と言う名前のHTMLファイルを格納する必要があります。用意するHTMLファイルの内容(HTML文章)は、任意で構いません。ただし、ここでは、以下の内容にするものとします。

<HTMLファイル HTMLSample1.html の内容>
<html><body>ひとつ目のHTMLサンプルで、ここの内容は、ブラウザに表示されます。</body></html>

<HTMLファイル HTMLSample2.html の内容>
<html><body>ふたつ目のHTMLサンプルで、ここの内容は、ブラウザに表示されます。</body></html>


 実行結果



「サーバー開始」ボタンをクリックすると、本サンプル(簡易Webサーバー)の受け付けが始まります。受け付けを開始した後は、クライアント(Webブラウザ)で、該当URL を指定して下さい。クライアント(Webブラウザ)に、該当HTML の内容が表示されます。

<注意事項>「処理占有に対する対策について」で説明しましたが、本サンプルプログラム(簡易Webサーバー)を終了する方法はなく、いつまでも作動を続けます。よって、本サンプルは、デバッグで開始して、終了時は、[デバッグ] - [すべて中止] で強制終了して下さい。


 実行画面.jpg



 さいごに



今回のサンプルは、一連の関連サンプルの中で比較的最初(3回目)のサンプルです。よって、ソースコードをなるべく単純にしています(今までのサンプルよりは、機能が実装されましたが、それでもかなり単純です)。本サンプルの目的は、サーバーがどのようなコードになるのか、学習することが主目的だからです。すなわち、今回のサンプルでは、実用性がないです。実用性のあるサンプルは、もっと後のサンプルで用意する予定です。