[TCP/IP 소켓 프로그래밍] TCP 클라이언트
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 의 크기를 미리 지정하는것 또한 중요한데, 네트워크 프로그래밍에서 데이터의 일관성과 정확성을 보장할 수 있으며, 버퍼를 할당해서 데이터를 안전하게 저장할 수 있고, 효율적인 메모리 사용도 가능하기 때문이다. 그래서 데이터를 주고 받을 때는 데이터의 크기를 미리 지정해서 데이터를 송수신하는것이 좋다.