スレッドでメッセージを受信

スレッドを使ったメッセージの受信と、IPアドレスを指定したメッセージの送信です。

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

プログラムの説明

  1. IPアドレスを指定して送信/受信 のスレッド版です。
    基本的な説明は上記のページを参照して下さい。
    スレッドを使うときは using で System.Threading; を定義して下さい。
    今回はスレッドでメッセージを受信するので、タイマは必要ありません。
  2. MyForm Class の最初に Internet Object Class を定義して下さい。
    Constructor に MyForm のパラメータを追加して MyF に格納します。
    MyF はスレッドでメッセージを受信したときに Form を再描画するために使います。
        public class Internet 
        {
            MyForm              MyF;
                :
                :
            // Constructor
            public Internet(MyForm mf, String Port) 
            {
                MyF = mf;
                :
                :
    
  3. 前回に比べて ReciveMessage() メソッドが変わります。
    Listener に null が設定されるとメソッドを終了します。
    メッセージが受信されると ReciveMsg に格納して MyF.Invalidate() を実行します。
    Invalidate() を実行すると MyForm Class の OnPaint() が呼ばれます。
            // Message の受信
            public void ReciveMessage()
            {
                TcpClient   client = new TcpClient();
    
                while(Listener!=null)
                {
                    if (Listener.Pending())     //待機中の接続要求があるとき
                    {
                        ReciveMsg = string.Empty;
                        //接続 
                        client = Listener.AcceptTcpClient();
                        Console.WriteLine("接続されました");
                        NetworkStream stream = client.GetStream();
    
                        Byte[] bytes = new Byte[33];
                        int i;
    
                        //メッセージを受信 
                        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                        {
                            String data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
                            ReciveMsg = ReciveMsg + data;
                        }
                        MyF.Invalidate();
    
                        client.Close();
                    }
                } 
            }
    
  4. MyForm の Main Program です。
    Thread はスレッド領域の定義です。
    Inet は Internet Object Class の定義です。
    MsgLog は通信記録の領域です。
        //☆ MyForm Program
        public  Thread   threads;          //スレッドの領域
        public  Internet Inet = null;      //Internet Object Class
        public  String   MsgLog;
        
  5. Button1_Click() で Internet Object Class を生成して通信準備を整えます。
    threads.Start() でスレッドを開始します。
        private void Button1_Click(object sender, EventArgs e)
        {
            Inet = new Internet(this, textBox1.Text);
            threads = new Thread(new ThreadStart(Inet.ReciveMessage));
            threads.Start();
    
            MsgLog += "StartUP: ";
            MsgLog += textBox3.Text;
            MsgLog += " / ";
            MsgLog += textBox1.Text;
            MsgLog += "\r\n";
            textBox5.Text = MsgLog;
        }
        
  6. Button2_Click() でプログラムを終了します。
        private void Button2_Click(object sender, EventArgs e)
        {
            if (Inet != null)
            {
                Inet.Listener = null;
                threads.Join();         // スレッドの終了を待つ
            }
            this.Dispose();
        }
        
  7. OnPaint() で ReciveMsg を MsgLog に追加して表示します。
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            if (Inet != null)
            {
                MsgLog += "受信: ";
                MsgLog += Inet.ReciveMsg;
                MsgLog += "\r\n";
                textBox5.Text = MsgLog;
            }
        }
        
  8. プログラムをテストする手順は IPアドレスを指定して送信/受信 を参照して下さい。

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