C#でTCPサーバを作ってみる

chakemiです。 本日は、C#でTCPサーバを作ってみようと思います。

開発環境

  • WindowsXP Pro SP3
  • VisualStudio2008

今回は手始めなのでコンソールアプリケーションで、TCPソケット生成には便利なTCPListenerとTCPClient クラスを使ってServer-Clientの1対1のサーバを作ってみます。

では最初に、名前空間のusingディレクティブを追加します。

1
2
3
using System.Net;     //IPEndPointクラス
using System.Net.Sockets; //TCPListener、TCPClientクラス
using System.IO;

TCPListenerコンストラクタの引数に必要なIPEndPointを生成し、TCPListenerのインスタンスを生成します。 IPEndPointにはサーバのIPアドレスと待ち受けポートを渡します。

1
2
IPEndPoint ipAdd = new IPEndPoint(IPAddress.Parse("192.168.1.113"), 8888);
TcpListener listener = new TcpListener(ipAdd);

Startメソッドを実行し、待ち受けを開始します。 引数には接続待ちのバックログを指定しますが、省略した場合、デフォルト値が使用されます。

1
listener.Start();

接続要求が来たら、接続を許可し、TcpClientオブジェクトを生成します。

1
TcpClient client = listener.AcceptTcpClient();

TcpClientの接続状態が確認出来たら、以降これを使用してデータ送受信をするのでListenerを閉じちゃってNetworkStreamクラスとStreamReaderクラスのインスタンスを生成。

1
2
3
4
5
6
if (client.Connected)
{
    listener.Stop();
    NetworkStream netStream = client.GetStream();
    StreamReader sReader = new StreamReader(netStream, Encoding.UTF8);
}

あとは、永遠とデータ受信処理のループを回します。

1
2
3
4
5
6
7
8
9
10
11
string str = String.Empty;

do
{
    str = sReader.ReadLine();
    if (null == str)
    {
        break;
    }
    Console.WriteLine(str);
} while (!str.Equals("quit"));

こんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace testTCPServer
{
    class Program
    {
        static void Main(string[] args)
        {
            IPEndPoint ipAdd = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 8888);
            TcpListener listener = new TcpListener(ipAdd);
            listener.Start(0);
            Console.WriteLine("Port:8888のListenを開始しました。");

            TcpClient client = listener.AcceptTcpClient();
            Console.WriteLine("クライアントが接続しました。");

            if (client.Connected)
            {
                listener.Stop();
                NetworkStream netStream = client.GetStream();
                StreamReader sReader = new StreamReader(netStream, Encoding.UTF8);

                string str = String.Empty;

                do
                {
                    str = sReader.ReadLine();
                    if (null == str)
                    {
                        break;
                    }
                    Console.WriteLine(str);
                } while (!str.Equals("quit"));
                sReader.Close();
                client.Close();
            }
            Console.WriteLine("終了するには、Enterキーを押してください");
            Console.ReadLine();
        }
    }
}

サーバを起動して、コマンドプロンプトからtelnetで接続できたら完成。

1
telnet 192.168.1.2 8888

次回ももう少し通信系の勉強をしようかと思います。

Comments