VisualBasicやC#で簡単なクライアント・サーバープログラムをつくろう 第二回:サーバー編
はじめに
前回のクライアントアプリ制作に引き続き、今回はサーバー側のアプリ制作と実際の動作確認を行います!
VisualBasicやC#で簡単なクライアント・サーバープログラムをつくろう 第一回:クライアント編 - まやのはてな
まだクライアントや、当クラスライブラリでできることについての解説を閲覧されていない方は、先に上記記事をご覧ください。
ダウンロード
Dropbox - ServerSampleProgram_v0_0.zip
ファイル名をクリックしてダウンロードします。
前回とはサンプルプログラムがサーバーアプリに置き換わっています。
ダウンロードしたファイル内の構成
・クラスライブラリ本体
プロジェクトの新規作成時の参照の追加に使用します。
なお、クライアントとサーバーの両方のクラスライブラリが封入されています。
・サーバー・クライアントアプリ
サーバーとクライアントの機能を備えもつ、便利なアプリです。
サンプルプログラムの動作確認、サーバーとクライアントの挙動の確認に使用します。
・サンプルプログラム
今回制作するサーバーアプリの完成版が入っています。
ソースプロジェクト
同封しているクラスライブラリおよびアプリケーションのすべてのソースプロジェクトがあります。コードの中身を詳しく知りたい方におすすめです。
サーバークラスライブラリの使い方
参照追加
例によって参照の追加を行います。
ダウンロードしたファイルの中にある
クラスライブラリ本体(フォルダー)\サーバー(フォルダー)\Server.dll
を参照に追加してください。なお、Server.dllを他のフォルダーに移してから参照の追加を行いたい場合は、必ずサーバー(フォルダー)内のすべてのファイルを一緒に移してください。
追加が終わったら、下記コードをコードファイルの一番上に入力します。
これにより、Serverと入力しなくてもServer内のクラスを参照できるようになります。
宣言
宣言ができたら、早速サーバーの動作を開始さてみましょう。
はい、おしまい!
これだけでサーバーとしての動作を開始してくれます。ただし、ポート番号は最初にスタートさせるときの一回しか指定することができないので、注意が必要です。
もし動作中にポート番号を変更しようと思ったら、その都度アプリ自体を再起動する必要があります。
サーバーが動作したからといって、クライアントから送られてきたメッセージを受信できないと意味がありません。そこで、ここからはクライアントについてやクライアントから送られてくる情報の受け取り方を紹介します。
メッセージを受信する
ようは、メッセージが送られてきたら発生するイベントがあって、それを登録したうえで、発生時にe.Messageで取得すればいいということです。
しかしここで注意があります。
実は、通常とは違う別のスレッドでイベントが発生するのです。
何が問題かといいますと、
listBox1.Items.Add(e.Message); (C#)
ListBox1.Items.Add(e.Message) (VB)
のようなコントロールを操作することができません。
Console.WriteLineメソッドの場合は、どのスレッドから操作しても大丈夫なため特に問題がありませんでしたが、コントロールだと別のスレッドから操作するのに特別な処理を書き加えなければいけません。
▼それがこちら▼
すこしごちゃごちゃしたコードとなってしまいますが、これでコントロールの操作も行うことができます。また、Invokeの{}内(C#)もしくはSub() End Sub内(VB)であればいくつでも処理を記述することができます。
画像を受信する
メッセージの受信と違いはほとんどありません。イベントが発生したときに、メッセージと画像のどちらが送られてきたかわからないので、e.Typeで必ず調べてください。送られてきていないほうはnull(VBはNothing)が入っているのでエラーの原因になります。
クライアントが接続してきたことを知る
今だれがサーバーと接続しているかを確認するのに利用することができます
クライアントが接続を切断してきたことを知る
クライアントが接続してきたときとほぼ同じです。
サーバーを作る
以上の使い方を理解したうえで、実際に簡単なサーバーアプリを作ってみましょう。
プロジェクトの作成
C#もしくはVisualBasicで、Windows フォーム アプリケーションもしくはWPFアプリケーションを選択して、新規にプロジェクトを作成してください。
今回はC#とVBのWindows フォーム アプリケーションのソースコードを載せますが、VBは自動翻譯したものに手を加える作り方をしているので、おかしな書き方になってるかもしれないです。
コントロールの設置
以下の画像のように、コントロールを配置してみてください。
今回使用するコントロール (VBでは変数名の先頭が大文字になります)
- listBox1 (ListBox、メッセージの表示と画像の選択用)
- pictureBox1 (PictureBox、画像表示用)
表示しかしないのでとてもシンプルな作りです。
コーディング
上記と全く同じコントロール名、プロジェク名、フォーム名にすれば、下のソースコードをコピペするだけでしっかり動作してくれます(笑)
プロジェクト名はSampleServerApplicationCsp(C#)、SampleServerApplicationVb(VB)で、フォームの名前がForm1です。
VBは自動翻譯の関係で、
となってしまっていますが、最初からe.XXXXはe.IPAddressにしろe.MessageにしろString型ですので、
のようにConvert.ToString()をいれる必要はありません。
動作確認
これで、クライアントアプリ、サーバーアプリの両方が揃いました。
実際にちゃんと動くか試してみましょう。
確認方法
1.サーバーを起動(該当プロジェクトを開いて、F5キーを押下)
2.クライアントを起動(同上)
3.IPアドレス、ポート番号を設定する
サーバーとクライアントが同じPCの場合は、IPアドレスが127.0.0.1です。
違うPC同士の通信の場合は、サーバー側のPCのIPアドレスを入力します。
ポート番号はサーバーアプリのほうが9000固定なので必ず9000と入力します。
4.クライアントの接続をクリックする
このとき、エラーメッセージが表示されずに、サーバーに「[XXX.XXX.XXX.XXX]との接続が新たに確立されました」と表示されたら成功です。
5.メッセージを送信する
クライアントのテキストボックスに送るメッセージを入力し、メッセージを送信ボタンを押します。
無事に送信することができたら、テキストボックスから文字が消え、サーバーのほうにメッセージが表示されているはずです。
6.画像を送信する
「画像を選択」をクリックし、好きな画像を選択したら「画像を送信」をクリックして送信します。サーバー側では「画像を受信しました、この項目を選択すると見ることができます」と表示されるので、その項目をクリックすれば右側に送った画像が表示されます。
最後に
今回のサーバー・クライアントのクラスライブラリは高校の課題研究(卒業研究)で使うために制作したものです。記念の意も込めて紹介させていただきました。
最後まで見ていただきありがとうございます。
少しでも役に立てたら幸いです。
どうでもいいけど、抹茶ラテ飲みたい...