본문 바로가기

네트워크/채팅 프로그램

[TCP/IP 소켓 프로그래밍] 사용자 입력을 이용한 통신

사용자의 입력을 받고, 이 데이터를 서버로 보내보는 작업을 해보자. 

 

일단 클라이언트, 서버는 이전 포스팅에서 준비해놨으니, 이번에는 사용자 입력만 받아서 서버로 보내보자. 

 

통신 방법

간단하게 사용자 입력을 받아서 변수 하나에 넣어두면 될것 같고, 이 변수를 인코딩을 통해 byte[] 형태로 만들어준뒤, Stream 을 통해 서버로 보내주는 작업이 필요해보인다.  

 

 

public class ClientManager
{
    private static ClientManager clientMngInstance;

    private TcpClient Client;

    static public ClientManager Instance()
    {
        if(clientMngInstance == null)
        {
            clientMngInstance = new ClientManager();
        }

        return clientMngInstance;
    }

    public void ConnectToServer()
    {
        // (1) IP 주소와 포트를 지정하고 TCP 연결 
        while (true)
        {
            try
            {
                Console.WriteLine("Client 연결 요청 중 . . .");
                Client = new TcpClient("127.0.0.1", 7000);

                Thread.Sleep(1000);
                break;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        Console.WriteLine("서버 연결 완료 !! ==============================");
        SendDataToServer();
    }


    public void SendDataToServer()
    {
        NetworkStream Stream = null;

        while (true)
        {
            Console.Write("메시지를 입력하세요 : ");

            string? Msg = "";

            if(Msg == "q")
            {
                break;
            }

            while (true)
            {
                Msg = Console.ReadLine();
                if (Msg != null)
                {
                    break;
                }
                Console.WriteLine("메시지를 입력해주세요.");
            }

            byte[] Buff = Encoding.ASCII.GetBytes(Msg);

            Stream = Client.GetStream();

            // 서버로 보내는 데이터
            Stream.Write(Buff, 0, Buff.Length);
        }

        Stream.Close();
        Client.Close();
    }
}

 

간단하게 사용자 입력을 받아서 인코딩 작업을 통해 byte[] 형태로 만들어준 뒤, 스트림을 이용해서 서버로 데이터를 보내주었다. 이제 사용자가 입력한 문자는 서버로 넘어가게 되고, 서버에서는 이렇게 받아온 데이터를 콘솔창에 찍어줄 수 있다. 

 

 

다만, 한글과 같은 경우 제대로 데이터를 받아오지 못하는데, 이는 영어는 1바이트, 한글은 한문자당 2바이트 이다 보니, 사용자 입력을 byte[] 로 형태를 바꿔주는 과정에서 어디까지가 한문자인지 판단하지 못하게되는 오류가 발생하는것이다. 

 

인코딩이라고 함은, 문자를 어떤 방식으로 표현할지에 대한 약속 정도로 생각할 수 있다. 그리고 이러한 인코딩 방식에는 여러가지가 있는데, 아스키코드 혹은 유니코드 UTF-8 방식 등이 존재한다. 

 

지금까지 우리가 사용하던 인코딩 방식은 아스키코드 방식이었으며, 이는 한글과 같은 문자를 표현하기에는 부족한 방식이다. 이를 해결한 방식이 유니코드 방식이며, 유니코드 방식은 영어 뿐 아니라 한글과 같은 2바이트 문자까지도 표현할 수 있는 능력이 있다. 그렇다면 인코딩 방식을 아스키코드가 아닌 유니코드로 인코딩 하면 어떨까? 서버에서 문자를 받아오는 인코딩 방식과 클라이언트에서 서버로 문자를 보내는 인코딩 방식을 모두 유니코드로 바꿔준 뒤 실행해보았다. 

 

 

예상했던것과 같이 한글 또한 제대로 서버에 넘겨줄 수 있게 되었다.