System.Net.Sockets.SocketクラスでTCPクライアント・サーバーを実装する方法を理解するためのシンプルな例としてC#・VBでechoサーバーを作る。 echoサーバーは、クライアントから送信された内容をそのまま返送するだけのサーバー。
以下のコードは.NET Framework 4.5、Mono 3.8で動作確認済み。
echoサーバー
以下のコードでは、サーバーに接続してきた複数のクライアントを同時に処理できるよう、個別にスレッドを作成して処理する。 コード中では無効にしているStartSessionInNewAppDomain
メソッドを使用すると、クライアントごとにアプリケーションドメインを作成して処理するようになる。 文字コードはシステムのデフォルト(Encoding.Default
)を使用している。 また、例外処理等は省略している。
このコードではサーバー側のアドレスとしてローカルループバックアドレス(127.0.0.1
, IPAddress.Loopback)を使用しているため、同一マシンからでしかサーバーに接続できない。 IPAddress.Anyや具体的なアドレスを指定(IPAddress.Parse("192.168.0.xxx")
とするなど)すれば他のマシンからも接続できるようになる。
シェルでtelnet 127.0.0.1 22222
と入力すればサーバーに接続することができる。 接続後、適当な文字列を入力してサーバーに送信すると、同じ文字列が返送されてくる。
このサンプルではSend・Receiveメソッドを使って送受信を行っているが、送受信内容をStreamクラスで扱いたい場合はNetworkStreamクラスを使用することができる。 Socket
インスタンスをNetworkStream
クラスのコンストラクタに渡してインスタンスを作成することにより、NetworkStream
を使った送受信を行えるようになる。 またNetworkStream
からStreamReader・StreamWriterを作成すれば、StreamReader
・StreamWriter
を使ったファイルの読み書きと同様に送受信することもできるようになる。
クライアント
Socketクラスを使ってサーバーに接続し、コンソールから入力された文字列をサーバーに送信する。 送受信を並行して行えるよう、受信は非同期的に行うようにしている。 文字コードはシステムのデフォルト(Encoding.Default
)を使用している。 Ctrl+CまたはCtrl+Z(UNIXではCtrl+D)を押せばソケットを閉じてアプリケーションを終了する。