C# .NET

[C#][Network][Thread] C#에서 쓰레드를 이용한 에코서버의 기본구조

Code GGOON 2019. 3. 18. 11:49
반응형


// Thread Netwotk Server Exam


namespace threadNetworkExam

{

    public partial class Form1 : Form

    {


        // TCP 소켓통신 서버구현을 위해 TCP리스너 정의/초기화

        private TcpListener tcpListner = null;

       

        public Form1()

        {

            InitializeComponent();

        }


        // Thread Method

        // Client 접속시 스레드가 호출하여 작업할 메소드 정의

        private void AcceptClient()

        {

            while (true)

            {

                // Client 소켓통신을 위해 수신을 대기하는 TcpClient 생성

                // TcpListner를 통해 생성

                TcpClient tcpClient = tcpListner.AcceptTcpClient();


                if (tcpClient.Connected)

                {

                    // 접속한 Client IP정보를 얻어서 리스트박스에 추가

                    string str = ((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString();

                    listBox1.Items.Add(str);

                }


                EchoServer echoServer = new EchoServer(tcpClient);

                Thread th = new Thread(new ThreadStart(echoServer.Process));

                th.IsBackground = true;

                th.Start();


            }

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            tcpListner = new TcpListener(3000);

            tcpListner.Start();


            // 서버의 IP주소를 얻어서 텍스트박스에 넣는다.

            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());

            for(int i = 0; i < host.AddressList.Length; i++)

            {

                if(host.AddressList[i].AddressFamily == AddressFamily.InterNetwork)

                {

                    textBox1.Text = host.AddressList[i].ToString();

                    break;

                }

            }

        }


        private void Form1_FormClosing(object sender, FormClosingEventArgs e)

        {

            tcpListner.Stop();         

           

        }


        private void button1_Click(object sender, EventArgs e)

        {

            // 서버시작 버튼클릭시 클라이언트 접속대기 및 처리를 위한 쓰레드 생성

            // Main 종료시 같이 종료되기위해 백그라운드로 설정

            Thread th = new Thread(new ThreadStart(AcceptClient));

            th.IsBackground = true;

            th.Start();

        }

    }


    public class EchoServer

    {

        TcpClient refClient;

        private BinaryReader br = null;

        private BinaryWriter bw = null;

        int intValue;

        float floatValue;

        string strValue;


        public EchoServer(TcpClient client)

        {

            refClient = client;

        }


        public void Process()

        {

            NetworkStream ns = refClient.GetStream();

            try

            {

                br = new BinaryReader(ns);

                bw = new BinaryWriter(ns);


                while(true)

                {

                    intValue = br.ReadInt32();

                    floatValue = br.ReadSingle();

                    strValue = br.ReadString();


                    bw.Write(intValue);

                    bw.Write(floatValue);

                    bw.Write(strValue);


                }

            }

            catch (SocketException se)

            {

                br.Close();

                bw.Close();

                ns.Close();

                ns = null;

                refClient.Close();

                MessageBox.Show(se.Message);

                Thread.CurrentThread.Abort();

            }

            catch (IOException ex)

            {

                // 연결이 끊어져 읽을 수 없을떄.

                br.Close();

                bw.Close();

                ns.Close();

                ns = null;

                refClient.Close();

                MessageBox.Show(ex.Message);

                Thread.CurrentThread.Abort();

            }

        }

    }

}





반응형