네트워크

[TCP/IP 소켓 프로그래밍] TCP 클라이언트

차나히 2023. 10. 11. 19:08

TCP Client 통신

 

네트워크 통신은 데이터를 요청하는 PC 와 요청받은 데이터를 처리하는 PC 간의 통신이다. 

 

보통 여기서 데이터를 요청하는 PC 는 클라이언트, 데이터를 처리하는 PC 를 서버라고 지칭한다.

 

이러한 네트워크 통신의 종류중 TCP 통신이 있으며, 이번에는 간단한 C# 네트워크 예제를 통해 이를 알아보자. 

 

namespace TcpCli
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) IP 주소와 포트를 지정하고 TCP 연결 
            TcpClient tc = new TcpClient("127.0.0.1", 7000);
            //TcpClient tc = new TcpClient("localhost", 7000);
 
            string msg = "Hello World";
            byte[] buff = Encoding.ASCII.GetBytes(msg);
 
            // (2) NetworkStream을 얻어옴 
            NetworkStream stream = tc.GetStream();
 
            // (3) 스트림에 바이트 데이타 전송
            stream.Write(buff, 0, buff.Length);
 
            // (4) 스트림으로부터 바이트 데이타 읽기
            byte[] outbuf = new byte[1024];
            int nbytes = stream.Read(outbuf, 0, outbuf.Length);
            string output = Encoding.ASCII.GetString(outbuf, 0, nbytes);
 
            // (5) 스트림과 TcpClient 객체 닫기
            stream.Close();
            tc.Close();
 
            Console.WriteLine($"{nbytes} bytes: {output}");
        }
    }
}

 

1. TcpClient 를 이용하면 네트워크 통신을 위한 TCP 객체를 만들 수 있으며, 생성자로 IP 주소와 포트번호를 전달하면 서버와 연결이 가능하다. 만일 빈 생성자로 생성하게 되면, 서버와 연결은 불가하며 추후에 Connect() 함수를 통해 명시적으로 서버와 접속해야한다. 

 

2,3,4. TCPClient 를 이용하면 NetworkStream 을 가져올 수 있다.  이 NetworkStream 의 Write() 함수를 이용하면 데이터를 서버로 보낼 수 있으며, Read() 함수를 통해 서버로 부터 데이터를 받을 수 있다. 또 데이터는 byte 의 형태로 주고받아야 한다. 단, 예제에서는 Read() 를 한번만 호출 했으나, 실제로 데이터를 모두 받아오기 위해서는 루프문을 이용해서 Read() 함수를 사용해야 서버가 보낸 모든 데이터를 읽어올 수 있게된다. 

 

5. 데이터의 교환이 모두 끝나면 NetworkStream 와 TCPClient 는 close() 함수를 이용해서 명시적으로 닫아주어야 한다. 

 

데이터 형식 : byte 

네트워크 통신을 할 때에는 byte 의 형태로 데이터를 주고 받는것이 중요하다. 다양한 형식의 데이터를 전송하기에도 좋으며, 대부분의 네트워크 프로토콜이 byte 를 데이터의 형식으로 채택하고 있기 때문이다. 

 

또한 byte 의 크기를 미리 지정하는것 또한 중요한데, 네트워크 프로그래밍에서 데이터의 일관성과 정확성을 보장할 수 있으며, 버퍼를 할당해서 데이터를 안전하게 저장할 수 있고, 효율적인 메모리 사용도 가능하기 때문이다. 그래서 데이터를 주고 받을 때는 데이터의 크기를 미리 지정해서 데이터를 송수신하는것이 좋다.