クライアント・サーバのしくみを知る
クラスライブラリを利用すれば、ウェブやメールなどの高度なサービスを簡単に利用することができます。これらのサービスを支えるより基本的なネットワーク機能を知ることにしましょう。
ネットワークを介して、なんらかのサービスを要求するコンピュータやソフトウェアのことを、クライアント(client)と呼びます。一方、この要求を待ち受けてサービスを提供する側を、サーバー(server)と呼びます。
作成するプログラムは、これまでに作ってきたウェブやメールの基本となると考えれば良いでしょう。
これから作成するプログラムは、サーバーがクライアントからの接続を待ち受けるようになっています。そしてクライアントが接続すると、文字列を送受信するサービスが行われるようになっています。
サーバーのプログラムを作成する
最初に、サーバーのコードを入力してみてください。このサーバは、クライアントからの要求を待ち受けて、文字列を送信する機能を持っています。
//sample5S.cs
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace lesoon10
{
class sample5S
{
public static string HOST = "localhost";
public static int PORT = 10000; //待機するポート番号を指定します
static void Main(string[] args)
{
IPHostEntry ih = Dns.GetHostEntry(HOST);
TcpListener tl = new TcpListener(ih.AddressList[0], PORT);//①サーバーソケットを作成します
tl.Start();
Console.WriteLine("待機します。");
while (true)
{
TcpClient tc = tl.AcceptTcpClient();//②接続を受け付けます
StreamWriter sw = new StreamWriter(tc.GetStream());//出力ストリームを作成します
sw.WriteLine("こちらはサーバーです。");//文字列を書き出します
sw.Flush();
sw.Close();
tc.Close();//接続をクローズする
}
}
}
}
クライアントのプログラムを作成する
次にクライアントのコードを作成することにします。こちらはウインドウ上で動作するアプリケーションとして作成してみましょう。サーバからの文字列を受信して表示する機能を持つクライアントです。クライアントとサーバーは別のプロジェクトとして作成してください。
//sample5C.cs
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Windows.Forms;
namespace lesoon10
{
class sample5C : Form
{
public static string HOST = "localhost";//ホスト名を指定します
public static int PORT = 10000;//ポート番号を指定します
private TextBox tb1;
private Button bt;
static void Main(string[] args)
{
Application.Run(new sample5C());
}
public sample5C()
{
this.Text = "lesson10 sample5 Client";
this.Width = 300; this.Height = 300;
tb1 = new TextBox(); tb1.Multiline = true;
tb1.ScrollBars = ScrollBars.Vertical;
tb1.Height = 150;tb1.Dock = DockStyle.Top;
bt = new Button();
bt.Text = "接続";bt.Dock = DockStyle.Bottom;
tb1.Parent = this;bt.Parent = this;
bt.Click += new EventHandler(bt_Click);
}
//サーバーに接続します
public void bt_Click(object sender, EventArgs e)
{
TcpClient tc = new TcpClient(HOST, PORT);
//入力ストリームを作成します
StreamReader sr = new StreamReader(tc.GetStream());
string str = sr.ReadLine(); //文字列を読み込みます
tb1.Text = str;
sr.Close();
tc.Close(); //接続をクローズします
}
}
}
サーバーのホスト名
ここでは、同じマシン上のサーバーに接続するために、”localhost”というホスト名を指定しています。異なるサーバーに接続するためには、別のホスト名を使ってください。
クライアントの「接続」ボタンを押すと、サーバーに接続して文字列を受信します。なお、最初にサーバーが起動されていないと、クライアントが文字列を受け取ることができないので注意してください。
TCPの仕組みを知る
さて、このプログラムでは、TCP(Transmission Control Protocol)と呼ばれるしくみを使って、クライアントとサーバーを接続しています。TCPによってクライアントとサーバー間の接続が確立されると、それ以降はファイルと同じように、お互い文字列を書き出したり読み込んだりできるようになります。
TCPはインターネットを支える基本のプロトコルです。TCPでは、接続するコンピュータを特定するために、IPアドレス(またはホスト名)を指定します。さらに、そのコンピュータないで接続するプログラムを特定するために、ポート番号(port number)と呼ばれる数値を使います。
サーバーは指定されたポート番号で、クライアントの接続を待ちうけます。クライアントはそのポート番号を指定して、サーバに接続するのです。
小さな数のポート番号を指定して、WebやFTP等といったよく使われる別のネットワークプログラムのために予約されていますので、サンプルでは10,000と言う大きな番号を使ってます。
TCPとUDP
TCPはクライアントとサーバーの接続を確立してから、データの送受信を行います。このほか、インターネットでは、1つのコンピュータから一方的にデータを送信するためのプロトコルである、UDP(User Datagram Protocol)が使われることもあります。プログラムでUDPを扱うときには、UDPClientクラスなどを使います。
コメント