기본 콘텐츠로 건너뛰기

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


// 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();
            }
        }
    }
}



이 블로그의 인기 게시물

Devexpress GridView 팁들

GridView 를 사용하다 보면 Cell 들을 Merge할 때가 발생합니다. 따라서, Cell Merge하는 방법은 아래와 같이 할 수 있습니다. 1. 세로 Merge GridView.OptionsView.AllowCellMerge = true; 이와 같이 옵션을 설정하면, 기본적으로 Column 단위로 같은 Value 값을 가지는 Cell 단위로 Merge를 합니다. GridColumn.OptionsColumn.AllowMerge = false; 이와 같이 할경우 해당 Column은 Merge를 실행하지 않습니다. GridView.CellMerge Event를 통해 사용자 조건별로 Merge를 할 수 있습니다 void gridView1_CellMerge(object sender, DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs e) {                if (e.Column.FieldName == "Q'TY")     {         int iValue1 = Convert.ToInt32(e.CellValue1);         int iValue2 = Convert.ToInt32(e.CellValue2);         e.Merge = true;         e.Handled = true;     } } 2. 가로 Merge 가로 Merge 같은 경우는 GridView에서 옵션으로 기본 제공하지 않습니다. 따라서 해당 Cell을 강제적으로 다시 그려주는 등 여러 가지 Event를 사용해야 합니다. 따라서 Devexpress 에서 예제로 나오 있는 곳을 링크하는 것으로 대신합니다. Merge cells Horizontally in GridView https://www.devexpress.com/Support/Center/Example/Details/E2472/how-to-merge-cells-horizontally-in-gr

[C#] 연산자 목록(Operators)

[C#] C# 프로그램의 일반적인 구조(A skeleton of a C# program)

// A skeleton of a C# program  using System; namespace YourNamespace {     class YourClass     {     }     struct YourStruct     {     }     interface IYourInterface      {     }     delegate int YourDelegate();     enum YourEnum      {     }     namespace YourNestedNamespace     {         struct YourStruct          {         }     }     class YourMainClass     {         static void Main(string[] args)          {             //Your program starts here...         }     } } By Microsoft.MSDN :: .NET Guide Docs