現在時刻を知らせる

C# で Server を常駐させて、現在時刻を Client に知らせます。

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

TCP Server の説明

  1. Server と Client で通信 では通信が終わるとすぐ終了しました。
    今回は Server を常駐させて、何度でも Client から要求がある度に現在時刻を知らせます。
  2. Server を常駐させるのは簡単で、接続待ちの状態でループするだけです。
    今回は Server から Client に対してメッセージを送信します。
    現在時刻を Byte[] に変換して stream.Write() で送信します。
    AcceptTcpClient() を実行すると、接続待ち状態で待機して先に進みません。
    Server Program は終わらす手段を設けていないので、強制的に終了(×ボタンのクリックなど)させて下さい。
    これ以外は「Server と Client で通信」と同じです。
                //接続待機 
                Console.WriteLine("接続待機中"); 
                while(true)
                {
                    TcpClient client = server.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(); 
                }
        
  3. Client 側のプログラムは Server に接続要求を出して現在時刻を取得します。
    「Server と Client で通信」では Client 側から Server 側にメッセージを送信しましたが、今回は逆になっています。
    取得した TEXT(現在時刻)をコンソール画面に表示して終了します。
    /*****************************************/
    /*★ NowTime Client Program    前田 稔 ★*/
    /*****************************************/
    using System;
    using System.Net.Sockets; 
    
    class Client 
    { 
        public static void Main() 
        { 
           try 
           { 
               //サーバーに接続 
               Int32 port = 9999;
               TcpClient client = new TcpClient("127.0.0.1", port); 
     
               //サーバーからメッセージを受信 
               NetworkStream stream = client.GetStream(); 
               Byte[] bytes = new Byte[9]; 
               int i; 
    
               while((i = stream.Read(bytes, 0, bytes.Length))!=0)  
               {
                    String data = System.Text.Encoding.UTF8.GetString(bytes, 0, i); 
                    Console.WriteLine(String.Format("受信: {0}", data)); 
               } 
               client.Close(); 
           } 
           catch (Exception e)  
           { 
               Console.WriteLine(e.Message); 
           } 
        } 
    }
    

【演習】

  1. Client 側も一度だけでなく、ボタンのクリックなどで「繰り返し接続して時刻を取得」して下さい。
    これが出来れば Server を相手にジャンケンするゲームぐらいはすぐ組めるようになります。
    ジャンケンゲームの仕様です。
    1. Server を起動するとメモリに常駐します。
    2. Client の要求に対して、乱数で「グー/チョキ/パー」を決めて送信します。
    3. Client 側は「グー/チョキ/パー」のボタンを設定して、Server を相手にジャンケンします。
    4. 勝敗を判定して表示して下さい。
    5. 対戦成績も表示して下さい。
  2. Server Program を終了させる方法を考えて下さい。
    ネックは AcceptTcpClient() を実行すると、接続待ち状態になって制御が先に進まないことです。
    この状態を回避する最も簡単な方法は Pending() メソッドを使うことです。

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