포스트

Tcp 클래스를 이용한 TCP/IP 통신

TCP/IP with tcp class

Tcp 클래스를 이용한 TCP/IP 통신

앞서 우리는 Socket 클래스를 직접 사용해 TCP 서버/클라이언트를 구현해봤습니다.
이번에는 .NET 에서 제공하는 더 간단한 추상화 클래스TcpClientTcpListener 를 이용해
같은 기능을 훨씬 쉽게 구현하는 방법을 소개합니다.

TcpClient / TcpListener 란 ?

  • TcpListener: 서버에서 클라이언트의 접속을 기다릴 때 사용
  • TcpClient: 클라이언트가 서버에 접속할 때 사용
  • 내부적으로 Socket 클래스를 래핑하고 있어서 기본 원리는 같지만 사용법이 더 간단

1. TCP 서버 코드 (TcpListener)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class TcpServer
{
    static void Main()
    {
        TcpListener server = new TcpListener(IPAddress.Any, 9000);
        server.Start();
        Console.WriteLine("서버 시작됨. 클라이언트 기다리는 중...");

        TcpClient client = server.AcceptTcpClient();
        NetworkStream stream = client.GetStream();

        byte[] buffer = new byte[1024];
        int length = stream.Read(buffer, 0, buffer.Length);
        string received = Encoding.UTF8.GetString(buffer, 0, length);
        Console.WriteLine("수신: " + received);

        string response = "서버 응답: " + received.ToUpper();
        byte[] responseData = Encoding.UTF8.GetBytes(response);
        stream.Write(responseData, 0, responseData.Length);

        stream.Close();
        client.Close();
        server.Stop();
    }
}

2. TCP 클라이언트 코드 (TcpClient)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Net.Sockets;
using System.Text;

class TcpClientTest
{
    static void Main()
    {
        TcpClient client = new TcpClient("127.0.0.1", 9000);
        NetworkStream stream = client.GetStream();

        string message = "안녕하세요 서버!";
        byte[] data = Encoding.UTF8.GetBytes(message);
        stream.Write(data, 0, data.Length);

        byte[] buffer = new byte[1024];
        int length = stream.Read(buffer, 0, buffer.Length);
        string response = Encoding.UTF8.GetString(buffer, 0, length);
        Console.WriteLine("서버 응답: " + response);

        stream.Close();
        client.Close();
    }
}

차이점 요약 (Socket vs Tcp)

항목Socket 클래스TcpClient / TcpListener
난이도높음낮음(입문자용)
코드량많음적음
유연성매우 높음기본 기능만 제공
프로토콜TCP / UDP 가능TCP 전용
사용목적복잡한 서버 구현간단한 통신 구현

주의할 점

  • TcpClient.GetStream()을 통해 얻은 NetworkStream으로 통신함
  • 통신 후에는 반드시 stream.Close(), client.Close() 해야 포트가 정리됨
  • 데이터를 보내기 전에 서버가 반드시 먼저 실행되어 있어야 함

정리

  • TcpClient / TcpListener 는 TCP 통신을 가장 간단하게 구현할 수 있는 방법입니다.
  • 내부적으로는 여전히 Socket을 사용하지만, 불필요한 세부 구현을 숨겨서 코드가 훨씬 짧고 직관적입니다.
  • UI, 콘솔, 서비스 등 다양한 환경에서 빠르게 구현하고자 할 때 매우 유용합니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.