C# 기초 정리: 네트워크 프로그래밍

Table of Content

TcpListener, TcpClient 클래스

  • TcpListener: 서버 애플리케이션에서 사용. 클라이언트의 연결 요청 대기
  • TcpClient: 서버 및 클라이언트 애플리케이션 양쪽에서 사용
    • 클라이언트 쪽: 서버에 연결 요청
    • 서버 쪽: 클라이언트의 연결 요청 수락 후 통신에 사용할 TcpClient 인스턴스 반환
  • NetworkSteam: 서버와 클라이언트 간 데이터를 주고받는 스트림
    • TcpClient.GetStream(): NetworkStream 객체 반환
    • NetworkStream.Write(): 데이터 보내기
    • NetworkStream.Read(): 데이터 읽기
    • NetworkStream.Close(), TcpClient.Close(): 연결 종료

 

간단한 메아리 서버

class Program
{
    public static void Main(string[] args)
    {
        string bindIp = "127.0.0.1"; // 루프백 주소
        const int bindPort = 10000; //포트
        IPEndPoint localAddress;
        TcpListener server = null;
 
        try
        {
            /* IPEndPoint 객체: IP 통신에 필요한 IP주소와 포트 표현 */
            localAddress = new IPEndPoint(IPAddress.Parse(bindIp), bindPort);
 
            /* TcpListener객체: 클라이언트의 연결 요청 대기 */
            server = new TcpListener(localAddress);
 
            /* 클라이언트의 TcpClient.Connect()에 의한 연결 요청 대기 */
            server.Start();
            Console.WriteLine("메아리 서버 시작");
 
            while (true)
            {
                /* AcceptTcpClient(): 클라이언트의 연결 요청이 있기 전까지 대기
                 * 연결 요청이 오면 TcpClient 객체 반환 */
                TcpClient client = server.AcceptTcpClient();
                Console.WriteLine("클라이언트 접속: {0}", ndPoint)client.Client.RemoteEndPoint).ToString());
 
                /* 클라이언트와 통신하기 위한 NetworkStream 객체 생성 */
                NetworkStream stream = client.GetStream();
 
                int length;
                string data = null;
                byte[] bytes = new byte[256];
 
                /* 스트림으로부터 데이터를 읽어옴 */
                while((length = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    data = Encoding.Default.GetString(bytes, 0, length);
                    Console.WriteLine("수신: {0}", data);
 
                    /* 데이터를 그대로 클라이언트로 보냄 */
                    byte[] msg = Encoding.Default.GetBytes(data);
                    stream.Write(msg, 0, msg.Length);
                    Console.WriteLine("송신: {0}", data);
                }
 
                stream.Close();
                client.Close();
            }
        }
 
        catch(SocketException e)
        {
            Console.WriteLine(e);
        }
 
        finally
        {
            server.Stop();
        }
    }
}

 

간단한 메아리 클라이언트 예제

class Program
{
    static void Main(string[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("사용법: {0} <Message>", Process.GetCurrentProcess().ProcessName);
            return;
        }
 
        string bindIp = "127.0.0.1"; // 클라이언트 IP
        int bindPort = Convert.ToInt32(0); // 클라이언트 포트. 매개변수로 0을 넘기면 포트 자동 할당
        string serverIp = "127.0.0.1"; // 서버 IP
        const int serverPort = 10000; // 서버 포트
        string message = args[0];
 
        try
        {
            /* IPEndPoint 객체: IP 통신에 필요한 IP주소와 포트 표현 */
            IPEndPoint clientAddress = new IPEndPoint(IPAddress.Parse(bindIp), bindPort);
            IPEndPoint serverAddress = new IPEndPoint(IPAddress.Parse(serverIp), serverPort);
            Console.WriteLine("클라이언트: {0}, 서버: {1}", clientAddress.ToString(), erAddress.ToString());
 
            /* 서버 접속 */
            TcpClient client = new TcpClient(clientAddress);
            client.Connect(serverAddress);
 
            /* 서버로 데이터 보내기 */
            byte[] data = System.Text.Encoding.Default.GetBytes(message);
            NetworkStream stream = client.GetStream();
            stream.Write(data, 0, data.Length);
            Console.WriteLine("송신: {0}", message);
 
            /* 서버로부터 데이터 읽기 */
            data = new byte[256];
            string responseData = "";
            int bytes = stream.Read(data, 0, data.Length);
            responseData = Encoding.Default.GetString(data, 0, bytes);
            Console.WriteLine("수신: {0}", responseData);
 
            stream.Close();
            client.Close();
        }
 
        catch(SocketException e)
        {
            Console.WriteLine(e);
        }
 
        Console.WriteLine("클라이언트를 종료합니다.");
    }
}

 

댓글 남기기