C#/C# 서버

[C#/서버] 기초 소켓 프로그래밍

진서박 2023. 8. 22. 17:19
반응형

인프런 - Rookies님의 강의

https://www.inflearn.com/course/%EC%9C%A0%EB%8B%88%ED%8B%B0-mmorpg-%EA%B0%9C%EB%B0%9C-part4

 

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의

네트워크/멀티쓰레드/운영체제 등 핵심 전공 지식을 공부하고 게임 서버를 바닥부터 만들어보면서 MMORPG 기술을 학습하는 강의입니다., MMORPG 개발에 필요한 모든 기술, C# + Unity로 Step By Step! 🕹

www.inflearn.com

 

소켓 프로그래밍 입문

 

소켓 프로그래밍으로 간단한 서버와 클라이언트 간의 통신을 구현한다.

서버(ServerCore)는 클라이언트의 연결을 받아들이고 데이터를 주고받는 역할을 한다.

클라이언트(DummyClient)는 서버에 연결하여 데이터를 보내고 받는 역할을 한다.

 

서버 역할을 할 ServerCore 스크립트

namespace ServerCore
{
    class Program
    { 
        static void Main(string[] args)
        {
            // DNS (Domain Name System)
            // 123.1.2.3 와 같이 IP가 하드코딩 되어 있으면 IP가 바뀔 일이 있을 때 문제가 생김
            // => www.naver.com -> 123.1.2.3 : 이름으로 IP를 찾음
            string host = Dns.GetHostName();
            IPHostEntry ipHost = Dns.GetHostEntry(host);

            // 구글과 같이 트래픽이 많은경우, 주소를 다르게 알려줘서 부하를 분산하는데
            // 경우에 따라서 여러개의 IP주소를 알려줄 수 있도록 반환형이 배열
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);

            // 문지기
            Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                // 문지기 교육
                listenSocket.Bind(endPoint);

                // 영업 시작
                // backlog : 최대 대기수
                listenSocket.Listen(10);

                while (true)
                {
                    Console.WriteLine("Listening...");

                    // 손님을 입장시킨다
                    Socket clientSocket = listenSocket.Accept();

                    // 받는다
                    byte[] recvBuff = new byte[1024];
                    int recvBytes = clientSocket.Receive(recvBuff);
                    string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
                    Console.WriteLine($"[From Client] {recvData}");

                    // 보낸다
                    byte[] sendBuff = Encoding.UTF8.GetBytes("Welcome to MMORPG Server !");
                    clientSocket.Send(sendBuff);

                    // 쫓아낸다
                    clientSocket.Shutdown(SocketShutdown.Both);
                    clientSocket.Close();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

 

클라이언트 역할을 할 DummyClient 스크립트

namespace DummyClient
{
    class Program
    {
        static void Main(string[] args)
        { 
            // DNS (Domain Name System)
            string host = Dns.GetHostName();
            IPHostEntry ipHost = Dns.GetHostEntry(host);
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);

            // 휴대폰 설정
            Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                // 문지기한테 입장 문의
                socket.Connect(endPoint);
                Console.WriteLine($"Connected to {socket.RemoteEndPoint.ToString()}");

                // 보낸다
                byte[] sendBuff = Encoding.UTF8.GetBytes("Hello World!");
                int sendBytes = socket.Send(sendBuff);

                // 받는다
                byte[] recvBuff = new byte[1024];
                int recvBytes = socket.Receive(recvBuff);
                string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
                Console.WriteLine($"[From Server] {recvData}");

                // 나간다
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

 

반응형

'C# > C# 서버' 카테고리의 다른 글

[C#/서버] ReaderWriterLock  (0) 2023.08.22
[C#/서버] AutoResetEvent / ManualResetEvent  (0) 2023.08.20
[C#/서버] SpinLock  (0) 2023.08.18
[C#/서버] 메모리 배리어  (0) 2023.08.16
[C#/서버] 캐시 이론  (0) 2023.08.16