반응형

 

C# 으로 서버와 클라이언트 기본적인 연결 및 string 데이터 전송 코드이다

 

서버 코드

using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Text;

namespace ServerCore
{


    class Program
    {
        static void Main(string[] args)
        {
            //DNS : Domain Name System
            // 도메인을 하나 등록해서 해당하는 IP 를 찾아오면 관리가 쉬워짐
            //www.google.com => 

            string host = Dns.GetHostName();
            //host = "google.com";            //ipHost.AddressList[0] == {172.217.161.238}
            IPHostEntry ipHost = Dns.GetHostEntry(host);
            //이렇게 GetHostEntry 로 주소를 얻어오는 건 DNS 서버를 통해서 얻어 올 수 있게 됨

            // ipHost.addressList[0] = IPAddress.Parse("        경우에 따라서 ip 주소는 여러개 일 수도 있다 부하 분산을 위해서 addressList
            IPAddress ipAddr = ipHost.AddressList[0];
            IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);     //최종 주소

            //AddressFamily ip version 4,6 에 대한 것 , 위에서 자동으로 만들어줌, 
            //tcp 로 할 경우 stream, tcp 로 설정해준다
            //리슨 하는 자체가 소켓을 하나 만들어야 한다
            Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                listenSocket.Bind(endPoint);        //소켓에 ip 와 포트 할당


                //최대 동시 대기 수, 동시에 들어올대 10명까지만 처리 가능하고 그 위로는 실패가 된다
                listenSocket.Listen(10);


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

                    //클라의 접속이 있다면 받아오는 처리, 접속이 있을때까지 계속 대기, 즉 다음으로 넘어가지 않는다
                    //클라로부터 접속이 왔다면 accept 되어 클라와 별도 통실한 socket 이 생성되어 리턴된다
                    Socket clientSocket = listenSocket.Accept();


                    //클라이언트로부터 받아오는 처리
                    byte[] recvBuff = new byte[1024];
                    int recvBytpes = clientSocket.Receive(recvBuff);
                    string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytpes);
                    Console.WriteLine($"[From Client] {recvData}");


                    //클라이언트로 보내는 처리
                    byte[] sendBuff = Encoding.UTF8.GetBytes("Welcome to server!");
                    clientSocket.Send(sendBuff);

                    clientSocket.Shutdown(SocketShutdown.Both);     //연결된 소켓 끊기, 듣기와 말하기를 하지 않겠다는 것
                    clientSocket.Close();   //클라와 서버간의 연결 끊기

                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }
        }
    }
}

 

 

 

클라이언트 코드

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace DummyClient
{
    class Program
    {
        static void Main(string[] args)
        {
            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);

            //소켓으로 서버에 연결한다 , 서버 입장에선 accept 가 된다
            socket.Connect(endPoint);
            Console.WriteLine($"connected to {socket.RemoteEndPoint.ToString()}");


            //서버로 보낸다
            byte[] sendBuff = Encoding.UTF8.GetBytes("Hello world!");
            int bytesSent = socket.Send(sendBuff);

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

            //서버와 통신을 위해 생성했던 소켓 종료 처리
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
            

        }
    }
}

 

결과 창

 

서버에서는 클라에서 보낸 데이터를 보여주고

클라에서는 서버로부터 받은 데이터를 뿌려주고 종료한다

 

반응형

'서버(Server) > Server' 카테고리의 다른 글

_socket.ReceiveAsync 비동기 처리  (0) 2022.12.23
비동기 accept 처리 : _listenSocket.AcceptAsync  (0) 2022.12.23
소켓 통신  (0) 2022.12.22
통신 모델 OSI 7 계층  (0) 2022.12.22
javascript : Class  (0) 2018.08.19

+ Recent posts