いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

TcpListenerとTcpClientのサンプル (System.Net.Sockets, TcpListener, TcpClient, NetworkStream, ThreadPool)

以下自分用のメモ書きです。
.NETにてTCPでネットワーク通信を行なう場合、以下のクラスをよく利用します。

System.Net.Sockets.TcpListener
System.Net.Sockets.TcpClient

その際に、クライアントとリスナー間でストリームを利用してデータのやり取りを
行ないます。Javaと同じです。
利用するストリームクラスは

System.Net.NetworkStream

となります。


もちろん、生のSocketを利用して処理をすることも出来ますが、上記の
リスナーとクライアントを利用した方が楽です。


以下サンプルです。
サンプルでは、一秒周期でクライアント側から現在時刻を送信し、リスナー側(サーバー側)は
要求を受け取ったら単にそれを出力しているだけです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Gsf.Samples.Tmp{

    public class NetworkStreamSendReadSample : IExecutor{

        readonly Encoding TARGET_ENCODING = Encoding.GetEncoding("sjis");
        readonly string   HOST            = "localhost";
        readonly int      PORT            = 5555;

        public void Execute(){
            //
            // リスナーの開始.
            //
            // 今回は、サンプルなので要求を受け付けた後の処理は同じスレッドで処理している。(同期)
            // (通常は、受け付けた後の処理を同期させてしまうと他の要求がとれなくなるので別のスレッドにて
            //  処理をするのが一般的。)
            //
            StartTcpListener();
            //
            // リクエストの送信を開始.
            //
            StartRequestSending();

            MessageBox.Show("OKボタンを押下するとアプリケーションを終了します。", "情報");
        }

        void StartTcpListener(){

            ThreadPool.QueueUserWorkItem(
                delegate(object stateInfo){
                    TcpListener listener = new TcpListener(IPAddress.Any, PORT);

                    //
                    // リスナーの開始.
                    //
                    listener.Start();

                    //
                    // 要求を受け付ける.
                    //
                    for(;;){
                        using(TcpClient client = listener.AcceptTcpClient()){
                            using(StreamReader reader = new StreamReader(client.GetStream(), TARGET_ENCODING)){
                                Console.WriteLine(reader.ReadToEnd());
                            }
                        }
                    }
                } 
            );

        }

        void StartRequestSending(){

            ThreadPool.QueueUserWorkItem(
                delegate(object stateInfo){
                    for(;;){
                        using(TcpClient client = new TcpClient(Dns.GetHostEntry(HOST).AddressList[0].ToString(), PORT)){
                            using(StreamWriter writer = new StreamWriter(client.GetStream(), TARGET_ENCODING)){
                                DateTime now = DateTime.Now;
                                writer.Write(string.Format("{0} {1}", now.ToLongDateString(), now.ToLongTimeString()));
                            }
                        }

                        Thread.Sleep(1000);
                    }

                }
            );
        }

    }

}