소켓 프로그래밍 기초

원래벌레·2022년 8월 17일
0
post-custom-banner

🌞 소켓 프로그래밍의 흐름

손님 입장 (클라이언트)

1) 서버와 연락할 핸드폰을 준비한다.
2) 식당 번호로 입장을 문의한다.

=> 결과 :  손님들을 대표하는 대리인이 식당에 가게되고,
         손님은 휴대폰을 통해서 대리인과 연락이 가능하다.
         
         
1) 소켓 준비
2) 서버 주소로 Connect

소켓을 통해 Session 소켓과 패킷 송수신 가능

식당 입장 (서버)

1) 문지기를 고용한다.
2) 문지기를 교육한다.(식당 번호를 알려준다)
3) 영업을 시작한다. 최대 수용량을 초과하면 영업은 시작하지 않는다.
4) 손님의 대리인을 받는다.

손님 대리인을 통해 손님과 대화가 가능하다.

1) Listener 소켓 준비
2) Bind ( 서버 주소/Port를 소켓에 연동 )
3) Listen
4) Accept

클라 세션을 통해 손님과 통화가 가능하다.

🌞 소켓 프로그래밍 실습

🌼 서버부터 만들어 봅시다.

  • 리슨 소켓 ( 문지기 ) 생성 및 바인딩
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

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

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

            //문지기 교육
            listenSocket.Bind(endPoint);
  • 리슨 ( 영업 시작 )

            //영업시작
            //backlog : 최대 대기수
            listenSocket.Listen(10);
  • Accept ( 대리인을 입장 시킨다 )
            while(true)
            {
                Console.WriteLine("Listening...");
                
                //손님을 입장 시킨다.
                Socket clientSocket = listenSocket.Accept();
  • Receive & Send
                //받는다.
                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);
  • Close

                //쫓아낸다.
                clientSocket.Shutdown(SocketShutdown.Both);
                clientSocket.Close();
            }
            
        }

    }
}

🌼 Client를 작성해보자

  • 소켓 만들기 ( 핸드폰 마련 & 식당 정보 알아내기 )
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace DummyClient
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                //DNS(Domain Name Service
                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);
  • 서버와 연결 ( 문지기에게 전화 )

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

                // 보낸다
                byte[] sendBuff = Encoding.UTF8.GetBytes("Hello World!");
                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);
            }

        }
    }
}

profile
학습한 내용을 담은 블로그 입니다.
post-custom-banner

0개의 댓글