.NET/네트워크 프로그래밍 C#

TCP 통신 – echo 서버 및 클라이언트 구현 [C#]

언제나휴일 2020. 6. 25. 11:57
반응형

 

 

 

서버 측 코드

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace 에코_서버_응용
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sock=null;
            try
            {
                sock = new Socket(
                    AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp
                    );//소켓 생성

                //인터페이스와 결합
                IPAddress addr = IPAddress.Parse("[서버 IP 주소]");
                IPEndPoint iep = new IPEndPoint(addr, 10040);
                sock.Bind(iep);

                //백로그 큐 크기 설정
                sock.Listen(5);
                Socket dosock;
                while (true)//AcceptLoop
                {
                    dosock = sock.Accept();
                    DoItAsync(dosock);//DoIt
                }
            }
            catch
            {

            }
            finally
            {
                sock.Close();//소켓 닫기
            }
        }

        delegate void DoItDele(Socket dosock);
        private static void DoItAsync(Socket dosock)
        {
            DoItDele dele = DoIt;
            dele.BeginInvoke(dosock, null, null);
        }
        private static void DoIt(Socket dosock)
        {
            try
            {
                byte[] packet = new byte[1024];
                IPEndPoint iep = dosock.RemoteEndPoint as IPEndPoint;
                while (true)
                {
                    dosock.Receive(packet);
                    MemoryStream ms = new MemoryStream(packet);
                    BinaryReader br = new BinaryReader(ms);
                    string msg = br.ReadString();
                    br.Close();
                    ms.Close();
                    Console.WriteLine("{0}:{1} → {2}", iep.Address,iep.Port,msg);
                    if(msg == "exit")
                    {
                        break;
                    }
                    dosock.Send(packet);
                }
            }
            catch
            {
            }
            finally
            {
                dosock.Close();
            }
        }
    }
}

클라이언트 측 코드

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace 에코_클라이언트_응용
{
    class Program
    {
        static void Main(string[] args)
        {           
            Socket sock  = new Socket(
                    AddressFamily.InterNetwork,
                    SocketType.Stream,
                    ProtocolType.Tcp
                    );//소켓 생성
            //인터페이스 결합(옵션)
            //연결
            IPAddress addr = IPAddress.Parse("[서버 IP 주소]");
            IPEndPoint iep = new IPEndPoint(addr, 10040);
            sock.Connect(iep);
            string str;
            string str2;
            byte[] packet = new byte[1024];
            byte[] packet2 = new byte[1024];
            while (true)
            {
                Console.Write("전송할 메시지:");
                str = Console.ReadLine();
                MemoryStream ms = new MemoryStream(packet);
                BinaryWriter bw = new BinaryWriter(ms);
                bw.Write(str);
                bw.Close();
                ms.Close();
                sock.Send(packet);
                if(str == "exit")
                {
                    break;
                }
                sock.Receive(packet2);
                MemoryStream ms2 = new MemoryStream(packet2);
                BinaryReader br = new BinaryReader(ms2);
                str2 = br.ReadString();
                Console.WriteLine("수신한 메시지:{0}", str2);
                br.Close();
                ms2.Close();
            }
            sock.Close();//소켓 닫기
        }
    }
}

 

반응형