この知恵ノートを「知恵コレクション」に追加しました。
追加した知恵ノートはMy知恵袋の「知恵コレクション」ページで確認できます。
「知恵コレクション」に登録済みです。
再登録しました。
追加に失敗しました。
ノートに戻り、もう一度やり直してください。
すでに1,000件のノートが登録されています。
新しく追加したい場合は、My知恵袋の「知恵コレクション」ページで登録されているノートを削除してください。
追加できませんでした。
ノートは削除されました。
知恵コレに追加する:1人
C#でソケット通信のノンブロッキング通信サーバーの作成 第2段(TcpListener + TcpClient)
ライター:abiko_tetuさん(最終更新日時:2012/11/5)投稿日:2011/11/11 アドバイス受付中!
- ナイス!:
11
- 閲覧数:4890
- 付箋(アドバイス)指数普通
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
C# で ソケット通信の ノンブロッキング通信サーバーの作成 第2段(TcpListener + TcpClient)
*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
「C# で ソケット通信のサーバー用プログラムを作成する方法」における一連の説明(知恵ノート)において、ここでは、「C# で ソケット通信の ノンブロッキング通信サーバーの作成 第2段(TcpListener + TcpClient)」について説明します。
総合の目次
本ページを含めた関連事項の総合目次です。
http://note.chiebukuro.yahoo.co.jp/detail/n1654
参考
本サンプルと、特に関連性のあるサンプルを下記に記します。
それ以外の関連サンプルは、上記の総合目次を参照して下さい。
<前回サンプル>
本サンプルに至る前の段階でのサンプルです。
サンプル「C# で ソケット通信の基礎的サーバー作成(TcpListener + TcpClient)」
http://note.chiebukuro.yahoo.co.jp/detail/n1657
<関連サンプル>
下記の関連サンプルは、本サンプルと同じ主旨で、別のやり方で作られたサンプルです。
なお、本サンプルと関連サンプルは、電文処理部をスレッド化しています。
そのスレッド作成は、本サンプルでは、ソケット関連機能で用意されている機能を利用します。
これに対して関連サンプルでは、スレッド作成用に用意された機能を利用します。
サンプル「C# で ソケット通信の ノンブロッキング通信サーバーの作成 第1段(TcpListener + TcpClient)」
http://note.chiebukuro.yahoo.co.jp/detail/n1663
はじめに
ここでのサーバー用サンプルは、複数のクライアントから受信した場合に、マルチスレッドで対処するものです。
マルチスレッドとは、複数の処理部(スレッド)を、並列に実行させる技法です。
また、そのスレッド作成では、ソケット関連機能で用意されている機能を利用して作ります。
送受信部のスレッド化への対応/未対応
複数のクライアントからアクセスされる場合に備えて、受信電文に対する処理を、並列に行ないます。
すなわち、サーバープログラムでは、マルチスレッド(並列に各処理を実行する技術)の活用が重要になります。
本サンプルでは、そのマルチスレッドを活用して、受信電文の処理を行ないます。
なお、一般のスレッド作成用機能を用いても良いのですが、ソケット用のスレッド機能が用意されています。
本サンプルでは、そのソケット機能で用意されたスレッド機能を利用します。
サーバー機能の主制御用クラスの種類
ソケットサーバーを作るために Visual C# から用意されているクラスは、Socketクラス と TcpListenerクラスがあります。Socketクラスは、名前の通り、ソケット通信のためのクラスです。
これに対して、TcpListenerクラスは、Socketクラスよりも若干簡単にプログラムを書けるようにしたクラスです。
本サンプルでは、TcpListenerクラスのほうを使っています。
クライアントへの対処を直接行なう処理で使うクラスの種類
上記クラスのオブジェクトとは別に、クライアントへの直接の対処を行なうための、通信用オブジェクトを用意します。すなわち、その通信用オブジェクトは、クライアントから送られてきた電文を実際に処理するために使われます。
また、クライアントへ返信を返す処理も、そのオブジェクトを使います。
その通信用オブジェクトのクラスは、Socketクラス と TcpClientクラスがあります。
本サンプルでは、TcpClientクラスのほうを使っています。
(なお、TcpClientクラスは、TcpListenerクラス用に用意されたクラスです。よって、本サンプルでは、TcpClientクラスのほうを使います。しかし、Socketクラス も使えますので、別のサンプルでSocketクラスの場合を紹介します)
本サンプルの種類のまとめ
本サンプルは、マルチスレッドを活用して、複数クライアントへの対応を行なっている。
なお、その際の電文処理部のスレッドは、ソケット用として用意されている機能を用いて作成する。
サーバーの通信機能としての主制御は、TcpListenerクラスを用いる。
クライアントへの対処をするクラスは(すなわち、実際に電文の送受信をするコードを書くためのクラスは)、同じくTcpClientクラスを用いる。
サンプルコード
ここで取り上げるサンプルは、なるべく複雑にならない範囲で、ある程度は、実際に通信を確かめられるものとします。
本サンプの仕様
ボタンは、「サーバー開始」ボタンと「サーバー終了」ボタンと言う2個のボタンを用意しています。
「サーバー開始」ボタンを押すと、受信受け付けの無限ループが、動作開始となります。
「サーバー終了」ボタンを押せば、受信受け付けの無限ループは終了します。
サーバー開始の状態で、クライアントから電文が送られてきたら、その電文の内容をテキストボックスに表示します。
なお、サンプルコードのIPアドレスは、127.0.0.1とし、ポート番号は、9000にしています。よって、サンプルコードを試す場合は、実際に使うサーバーのIPアドレスに変更して下さい。
フォームデザイン等の前準備
コードを記述する前に、フォームのデザイン作成などの、以下の前準備を行なって下さい。
<プロジェクトの作成>
本サンプルの確認用に、新規にプロジェクトを作成して下さい。
プロジェクトの種類は、「Windowsフォームアプリケーション」です。
<フォームのデザイン>
デザイン画面で、Label(ラベル)を1個と、TextBox (テキストボックス) を1個と、 Button (ボタン)を2個貼り付けて下さい。
<イベントプロシージャの作成>
デザイン画面のフォームをダブルクリックして、Form1_Load() メソッドを作って下さい。
次に、デザイン画面のフォームが選択された状態で、「プロパティ」画面の「イベント」ボタン(雷マークのボタン)をクリックして下さい。
その「プロパティ」画面で、FormClosed と言う項目をダブルクリックして下さい。
そうすると、Form1_FormClosed()メソッドが作成されます。
また、先程貼り付けたデザイン画面上のボタン「button1」をダブルクリックして、button1_Click() メソッド を作って下さい。
同様にボタン「button2」もダブルクリックして、button2_Click() メソッド を作って下さい。
コード
記述量上限の制限で、別のページに記述しています。
http://note.chiebukuro.yahoo.co.jp/detail/n22810
実行結果
コードを書きましたら、その後は、実際にビルドして実行してみて下さい。
なお、本サンプルは、サーバー用プログラムです。クライアント用プログラムは、別途用意する必要があります(総合目次から、クライアント用プログラムを参照)。
備考
備考は、下記を参照。
http://note.chiebukuro.yahoo.co.jp/detail/n1808
上記は、第1サンプル用に用意した備考ですが、本サンプルでも共通します。
さいごに
ここでは、サーバー用プログラムを実際に試すことが、主要目的になっています。
なお、サーバーシステムの作成は、いろいろと難しい技術が必要です。
そのことから、初心者や中級者の中には、敷居が高い存在に感じる人もいると思います。
よって、本サンプルでは、なるべく単純にした通信プログラムで、実際に確かめてもらうことを目的にしています。
どのような様子のものかを、最初のさわり程度でも知っていれば、次のステップへ進みやすいと思います。
アドバイス(このノートのライターへのメッセージ)を送る
このノートはどうでしたか? いいと思ったことや、こうしたらもっとよくなるといったメッセージを送りましょう! ノートの内容やライターについて質問がある場合は、Q&Aから質問してみましょう
アドバイスを送るには、
Yahoo! JAPAN IDでのログインおよび
Yahoo!知恵袋の利用登録が必要です。
感想アドバイス履歴
このノートに関するQ&A
このノートに関するQ&Aは、まだありません。
あなたにおすすめの知恵ノート
あなたにおすすめのQ&A
- このC#をCに直していただけませんか? using System; using System.Collections.Generic; using Sys...
- C#の質問です。 ネットで調べたり自分なりに考えてみたのですが、 サーバーからクライアントへデータ...
- .net TcpClientクラスについて 使用するTCPポートの宣言は以下のように行いますが、 this._tcpHost =...
- VB2010で、PCと自動機をLANでつなぎ、ソケット通信を行いたいのですが、以下のプログラムでは接続で...
- C#での質問です。 学校の課題なのですが・・・。 ①スレッドに連番(1,2,3)を割り振る ②コンソールへ...