特集

.NETネットワーク・プログラミング入門

高木 健一
http://www.woodensoldier.info/
2004/12/18
Page1 Page2 Page3 Page4

2. .NETにおけるソケット通信の技術

2.1. ソケット通信を実装するためのクラス群

 ソケットによるネットワーク・プログラミングをサポートするために、.NET Frameworkのクラス・ライブラリにはSystem.Net名前空間、およびSystem.Net.Sockets名前空間が用意されている。下記の表はSystem.Net名前空間に所属する主なクラスである。

クラス 説明
IPAddress IPアドレスを提供するクラス
IPEndPoint IPアドレスとポート番号の組み合わせを提供するクラス
System.Net名前空間の主なクラス

 IPAddressクラスとIPEndPointクラスはIPアドレスおよびポート番号によるアドレス解決に使用されるクラスである。IPアドレスとポート番号の組み合わせは、ソケットで通信対象のアプリケーションを特定するために必要な情報である。

 次の表はSystem.Net.Sockets名前空間の主なクラスである。

クラス 説明
Socket ソケット・インターフェイスの実装クラス
SocketException ソケット・エラーが発生したときにスローされる例外
TcpClient TCP接続のためのクライアント接続を提供する
TcpListener TCPによるネットワーク・クライアントからの接続を待機する
NetworkStream ネットワーク・アクセスの基になるデータのストリームを提供する
System.Net.Sockets名前空間の主なクラス

 Socketクラスは、低レベルなAPI仕様を実装しているため、細かな制御ができる一方、プログラムが煩雑になりがちである。.NET FrameworkではTCP上でソケット通信を簡単にプログラミングできるよう、Socketクラスをベースとした、TcpClientクラスとTcpListenerクラスが用意されている。通常は主にこれらのクラスを利用してネットワーク・アプリケーションの通信の基礎部分を作成していくことになる。

 NetworkStreamクラスは、ネットワークを読み書きの対象とするストリームである。TcpClientクラスやTcpListenerクラスと組み合わせて使われることが多く、通信が確立した後のデータのやりとりに活躍する。ストリームについては、後ほどもう少し詳しく説明する。

2.2. TcpClientとTcpListenerの利用と通信イメージ

 TcpClientクラスとTcpListenerクラスを利用した通信のイメージは次のようになる。この図のように、ソケットを利用した通信では、接続を待つサーバと、それに対して接続を行うクライアントの2つにアプリケーションの役割が分けられるのが一般的である。

TcpListenerとTcpClientの通信手順
TcpListenerクラスとTcpClientクラスを使うと、クライアント/サーバ・プログラミングを簡単に行うことができる。

 TcpListenerクラスとTcpClientクラスを使った場合のクライアント/サーバ間の通信は、次のような手順で行われる。

 

まずサーバ側ではTcpListenerクラスを使用して、クライアントからの接続を待機する。

 

クライアント側はTcpClientクラスを利用して、サーバに接続する。

 

サーバはクライアント側からの接続要求を受けると、TcpClientオブジェクトを作成して通信を確立する。

 

一度通信が確立されれば、後はサーバとクライアントのTcpClientオブジェクト同士でデータの送受信が行えるようになる。

2.3. ストリーム

 ストリーム(Stream)とは順々に流れてくるデータのこと(=データの流れ)である。.NETではストリームに関するクラスがいくつか実装されていて、データの読み書きを強力にサポートしている。そのストリーム・クラスには、すでに紹介したNetworkStreamクラスのほかに、次の表のようものがある。ストリーム・データの接続先として、例えばファイル、ネットワーク、メモリなどがあるが、.NETではそれらの接続先に対してそれぞれストリーム・クラスが用意されている。

クラス 名前空間 説明
FileStream System.IO ファイルに対するストリーム
NetworkStream System.Net.Sockets ネットワークに対するストリーム
MemoryStream System.IO メモリに対するストリーム
BufferedStream System.IO ほかのストリームをバッファリングするストリーム
.NET Frameworkにより提供されているストリーム・クラスの種類
いずれも抽象クラスであるStreamクラス(System.IO名前空間)を継承したクラスである。この中でBufferedStreamクラスだけは、ほかのクラスと機能が異なり、ほかのストリームに対する入出力をバッファリングするためのもので、主にNetworkStreamクラスと組み合わせて使用する。

 これらのストリームに対して(データのエンコーディングなどを意識して)データの読み書きを行う機能は、(基本的に)ReaderクラスとWriterクラスに任される。.NETではReaderクラスとWriterクラスとして、次の表のものが用意されている。

クラス 説明
BinaryReader ストリームのデータをバイナリとして読み込む
BinaryWriter ストリームのデータへバイナリとして書き込む
StreamReader ストリームのデータをテキスト(文字列)として読み込む
StreamWriter ストリームのデータをテキスト(文字列)として書き込む
.NET Frameworkにより提供されているReaderクラス/Writerクラスの種類
いずれもSystem.IO名前空間のクラスだ。これらのクラスは単なるバイト・データであるストリームに対して、それを数値や文字(列)として読み書きできる。文字(列)として読み書きする場合には、文字コードのエンコーディング方法を指定できる。

 もちろん前述のストリーム・クラス自体にもReadメソッドやWriteメソッドは用意されているが、これらのメソッドでは文字コードのエンコーディング方法などを指定できない。そこで、そのようなエンコーディング作業の面倒を見てくれるのが、上記の表にあるReaderクラスとWriterクラスである。

 「ストリーム・クラスの種類」と「Readerクラス/Writerクラスの種類」の組み合わせにより、アクセス先のストリームとそのストリームに対するデータの読み書き方法が決まるのである。

 例えば、FileStreamクラスとBinaryReaderクラスの組み合わせであれば、ファイル・ストリームを対象にバイナリ・データを読み込むという指定をしたことになる。NetworkStreamクラスとStreamWriterクラスであれば、ネットワークを対象にテキスト・データを書き込むという指定をしたことになる。

 なお、ストリームについてより詳しくは、「C#プログラミングTip:ファイル入出力の基礎」を参照してほしい。

3. .NETにおける通信プログラムの実装

3.1. 簡易ファイル交換プログラムの作成

 それではここまで説明してきた内容を踏まえて、ソケット通信を利用した実際に動くWindowsアプリケーションを作成してみよう。

 今回は「簡易ファイル交換プログラム」を作成することにする。これは、このプログラムを実行している2つのコンピュータ間で、指定したファイルを送受信できる。基本的にはクライアント/サーバ型のTCP/IP通信プログラムであるが、プログラムはクライアントとサーバの両方の機能を持っており、特定のサーバ・プログラムは必要ない。

 なお今回は、プログラムを簡単にするためにWindowsプラットフォーム同士の通信のみを想定し、OSの違いによるテキスト・ファイルの文字コード変換などは行わない。

 まずは完成したプログラムの実行画面とその利用方法を紹介しよう。

.NETでのTCP/IP通信を使用した簡易ファイル交換プログラム
クライアント/サーバ型のTCP/IP通信プログラムで、指定したファイルを通信相手に送信するプログラム。ただし、OSの違いによるテキスト・ファイルの文字コード変換などは行わない。
  IPアドレスを入力する。
  [Connect]ボタンをクリックすると、で入力したIPアドレスのコンピュータへ接続を開始する。
  接続先のコンピュータへ送信するファイルのパスを入力する。
  [Open]ボタンをクリックすると、[ファイルを開く]ダイアログが表示される。このダイアログで選択したファイルのパスがに設定される。
  [Send]ボタンを押すと、で指定したファイルが接続先のコンピュータへ送信される。
  接続状況やファイルの送信状況が表示される。

 サンプル・プログラムなので、画面は至ってシンプルに作ってある。このプログラムでファイル交換をするには次のような手順で操作を行う。

(1)ファイル交換をしたい2つのコンピュータに簡易ファイル交換プログラムを配置し、その2つのコンピュータの両方でそれぞれのプログラムを立ち上げる。

(2)どちらか一方の画面で、相手先コンピュータのIPアドレスを入力し、[Connect]ボタンを押す。これで、ファイル交換の準備は完了。この状態ですでに2つのコンピュータが接続されているので、あとはどちらのコンピュータからでもファイルを送ることができる。

(3)ファイルの送り方は、(ファイル送信側のコンピュータの)簡易ファイル交換プログラムにある[Open]ボタンを押して[ファイル選択]ダイアログを表示する。そして、そのダイアログから送信したいファイルを選択し、[Send]ボタンを押す。これでファイルの送信は完了する。

(4)ファイルの受け取り方は、何の作業も必要ない。ファイル受信側のコンピュータの)簡易ファイル交換プログラムはファイルを受信すると、それを自動的に保存する。

 手順の(1)と(2)は、これまで解説してきたTcpClientクラスとTcpListenerクラスを使った通信の方法を使って実装している。次の節では(3)と(4)についてその仕組みを説明する。


 INDEX
  [特集] .NETネットワーク・プログラミング入門
    1.ネットワーク・プログラミングの概要
  2..NETにおけるソケット通信の技術
    3.簡易ファイル交換プログラムの仕組み
    4..NETにおけるTCP/IP通信処理の実装
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間