タイマ割り込みで、接続要求をセンスする

C# でタイマ割り込みを使って Client からの接続要求をセンスします。

前田稔(Maeda Minoru)の超初心者のプログラム入門

TCP Server の説明

  1. 現在時刻を知らせる では Console Mode で作成しましたが、 今回は Form を使って Server と Client の間で、何度でも繰り返して通信を行います。
    また Server Program を正常に終了させる方法に付いても説明します。
    Server Program を起動すると Client からの接続要求を受け付ける状態で待機します。
    Client のから要求に対して、現在時刻を送信します。
  2. Server 側は、タイマ割り込みを使って Client 側からの接続要求をセンスします。
    ベースとなるプログラムは 直接 Timer を貼り付ける を参照して下さい。
  3. MyForm Class の最初に Server Object Class を定義して下さい。
    Constructor でサーバーを起動して接続待機に入ります。
    Server Object Class はプログラム(MyForm Object Class)の終了時に自動的に開放されます。
    public class MyForm : Form
    {
        //☆ NowTime Server Object Class
        public class Server 
        {
            public TcpListener listener;
            public TcpClient   client;
    
            // Constructor
            public Server() 
            {
                try 
                {
                    //サーバーを開始 
                    Int32 port = 9999; 
                    IPAddress localAddr = IPAddress.Parse("127.0.0.1"); 
                    listener = new TcpListener(localAddr, port); 
                    listener.Start(); 
    
                    client = new TcpClient();
                    //接続待機 
                    Console.WriteLine("接続待機中"); 
                } 
                catch(SocketException e) 
                { 
                    Console.WriteLine(e.Message); 
                } 
            }
        
  4. NowTime() がタイマ割り込みから呼ばれる「Client に時刻を送信する」メソッドです。
    Pending() で接続要求待ちを確認して、AcceptTcpClient() で Client に接続します。
    AcceptTcpClient() を直接実行すると、接続待ち状態で先に進まなくなることがあるので注意して下さい。
    通信の説明は「Server と Client で通信」を参照して下さい。
            // NowTime メソッド
            public void NowTime()
            {
                if (listener!=null)
                {
                    if (listener.Pending())
                    {
                        //接続 
                        client = listener.AcceptTcpClient();
                        Console.WriteLine("接続されました"); 
                        NetworkStream stream = client.GetStream(); 
    
                        //メッセージを送信 
                        Byte[] data = System.Text.Encoding.UTF8.GetBytes(DateTime.Now.ToString()); 
                        stream.Write(data, 0, data.Length); 
    
                        client.Close(); 
                    }
                } 
            }
        } 
        
  5. MyForm の Main Program です。
    Server Object Class を生成して、タイマ割り込みで NowTime() メソッドを呼び出します。
    タイマ割り込みの説明は「直接 Timer を貼り付ける」を参照して下さい。
        //☆ MyForm Program
        private Timer timer1;
        private System.ComponentModel.IContainer components;
        Server  server;     //Server Object
    
        public MyForm()
        {
            InitializeComponent();
            server = new Server();
            timer1.Start();
        }
    
        // Timer 割り込みで接続要求を確認する 
        private void timer1_Tick(object sender, EventArgs e)
        {
            server.NowTime();
        }
        

TCP Client の説明

  1. Client 側のプログラムは Form に TextBox と Button を貼り付けて、Button をクリックする度に TextBox に時刻を表示します。
    Form に TextBox と Button を貼り付けて下さい。
    ボタンを選択して、稲妻型のアイコンから Click に Button1_Click のイベントを設定します。
    詳細は ToolBox からボタンを貼り付ける を参照して下さい。
  2. MyForm のコンストラクタに InitializeComponent() メソッドを呼び出すコードを追加して下さい。
        public MyForm()
        {
            InitializeComponent();
        }
        
  3. Button1_Click に Server に接続して現在時刻を取得するコードを記述します。
    今回は Client は Server からメッセージ(現在時刻)を受け取ります。
    受信したメッセージを TextBox に表示しています。
        private void Button1_Click(object sender, EventArgs e)
        {
           try 
           { 
               //サーバーに接続 
               Int32 port = 9999;
               TcpClient client = new TcpClient("127.0.0.1", port); 
     
               //サーバーからメッセージを受信 
               NetworkStream stream = client.GetStream(); 
               Byte[] bytes = new Byte[9]; 
               int i; 
               String msg = "";
    
               while((i = stream.Read(bytes, 0, bytes.Length))!=0)  
               {
                    String data = System.Text.Encoding.UTF8.GetString(bytes, 0, i); 
                    msg = msg + data; 
               } 
    
               textBox1.Text = msg;
               client.Close(); 
           } 
           catch  
           {
               textBox1.Text = "サーバーに接続出来ません";
           } 
        }
        
  4. 先に Server を起動してから Client を起動して下さい。
    Server と Client を一台のマシンで起動してテストして下さい。
    Client を二個以上同時に起動することも出来ます。

【演習】

サーバーを相手に「じゃけんゲーム」をするプログラムを作成して下さい。
  1. Server を起動すると Client からの接続要求を受け付ける状態で待機します。
  2. Client の要求に対して、乱数で「グー/チョキ/パー」を決めて送信します。
  3. Client 側は「グー/チョキ/パー」のボタンを設定して、Server を相手にじゃんけんします。
  4. 勝敗を判定して表示して下さい。
  5. 対戦成績も表示して下さい。
  6. 「グー/チョキ/パー」にウエイトを付けるともっと面白くなります。
    詳細は「超初心者のプログラム入門(C言語 Windows)/じゃんけんバトルゲームの説明」を参照して下さい。

超初心者のプログラム入門(C# Frame Work)