개발노트

12. [ASP .NET Core] TcpClient (Winform 으로 클라 만들기) 본문

서버 개발/ASP .NET Core

12. [ASP .NET Core] TcpClient (Winform 으로 클라 만들기)

mroh1226 2025. 3. 28. 21:41
반응형

WinForm을 이용한 TCP 클라이언트 애플리케이션 만들기

TCP 클라이언트를 이용한 통신은 다양한 네트워크 애플리케이션에서 중요한 역할을 합니다. 이번 글에서는 WinForm을 이용하여 TCP 클라이언트 애플리케이션을 만드는 방법을 다뤄보겠습니다. 이 애플리케이션은 서버와 연결하고 데이터를 송수신하는 기능을 제공합니다.

애플리케이션 개요

이 애플리케이션은 TCP 클라이언트로, 사용자가 버튼을 클릭하여 서버에 연결하고, 데이터를 보내고 받는 기능을 수행합니다. 요청 데이터는 단순 문자열로 서버에 전송되며, 서버로부터 응답을 받으면 그 내용을 화면에 표시합니다.

UI 구성

  • 연결 버튼 (btn_open): 서버와의 연결을 시작합니다.
  • 종료 버튼 (btn_close): 서버와의 연결을 종료합니다.
  • 요청 버튼 (btn_request): 서버로 데이터를 전송하고, 응답을 받습니다.
  • 응답 텍스트 박스 (txt_response): 서버의 응답 메시지를 표시합니다.

기능 설명

1. 서버에 연결

클라이언트는 버튼을 클릭하여 서버에 연결할 수 있습니다. 연결할 서버의 IP 주소와 포트 번호는 미리 설정되어 있으며, 이 예제에서는 127.0.0.1:2222로 설정했습니다.

서버와 연결되면 NetworkStream을 통해 데이터를 송수신할 수 있는 준비가 완료됩니다.

 

public partial class frm_tcpClient : Form
{
    private TcpClient tcpClient;
    private NetworkStream stream;

    public frm_tcpClient()
    {
        InitializeComponent();
    }

    // 서버와 연결하는 버튼 클릭 이벤트
    private async void btn_open_Click(object sender, EventArgs e)
    {
        try
        {
            // TCP 클라이언트 생성
            tcpClient = new TcpClient();
            // 서버와 연결 (127.0.0.1:2222로 설정)
            await tcpClient.ConnectAsync(IPAddress.Parse("127.0.0.1"), 2222);
            stream = tcpClient.GetStream();
            if (stream == null)
            {
                txt_response.Text = "서버 연결 실패";
                return;
            }
            txt_response.Text = "서버에 연결됨" + stream.ToString();
        }
        catch (Exception ex)
        {
            MessageBox.Show($"연결 실패: {ex.Message}");
        }
    }

    // 서버 연결 종료하는 버튼 클릭 이벤트
    private void btn_close_Click(object sender, EventArgs e)
    {
        if (tcpClient != null && tcpClient.Connected)
        {
            stream?.Close();
            tcpClient.Close();
            txt_response.Text = "연결 종료됨";
        }
    }

    // 서버로 요청을 보내고 응답을 받는 버튼 클릭 이벤트
    private async void btn_request_Click(object sender, EventArgs e)
    {
        if (tcpClient == null || !tcpClient.Connected)
        {
            MessageBox.Show("먼저 서버에 연결하세요.");
            return;
        }

        try
        {
            // 보내는 데이터 (단순 문자열 전송)
            string requestData = "Hello, Server!";
            byte[] requestBytes = Encoding.UTF8.GetBytes(requestData);

            // 서버로 요청 전송
            await stream.WriteAsync(requestBytes, 0, requestBytes.Length);
            await stream.FlushAsync();

            // 서버 응답 수신
            byte[] buffer = new byte[1024];
            int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
            if (bytesRead > 0)
            {
                string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                txt_response.Text = $"서버 응답: {response}";
            }
            else
            {
                txt_response.Text = "서버 응답 없음";
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show($"오류 발생: {ex.Message}");
            txt_response.Text = "통신 중 오류 발생";
        }
    }
}

서버와 연결하는 메서드 (btn_open_Click)

  • 목적: 클라이언트가 서버에 연결하는 기능을 담당합니다.
  • 설명:
    • TcpClient 객체를 생성합니다. 이 객체는 클라이언트와 서버 간의 연결을 관리합니다.
    • ConnectAsync 메서드를 호출하여 비동기적으로 서버에 연결합니다. 여기서는 127.0.0.1:2222로 연결을 시도합니다. IPAddress.Parse("127.0.0.1")는 로컬 호스트(IP 주소)를 지정하고, 2222는 포트를 지정합니다.
    • 연결이 성공하면 GetStream 메서드를 통해 네트워크 스트림을 얻습니다. 이 스트림을 통해 서버와 데이터를 주고받을 수 있습니다.
    • 연결이 실패하면 예외를 처리하여 "연결 실패" 메시지를 출력합니다. 연결이 성공하면 "서버에 연결됨" 메시지를 출력합니다.

서버 연결 종료하는 메서드 (btn_close_Click)

  • 목적: 서버와의 연결을 종료하는 기능을 담당합니다.
  • 설명:
    • 연결이 이루어진 상태에서 연결 종료 버튼을 클릭하면 호출됩니다.
    • tcpClient.Connected로 연결 상태를 확인하고, 연결된 상태라면 stream.Close()와 tcpClient.Close() 메서드를 호출하여 연결을 종료합니다.
    • 연결 종료 후 "연결 종료됨" 메시지가 표시됩니다.

서버로 요청 보내기 및 응답 받기 (btn_request_Click)

  • 목적: 서버에 요청을 보내고 응답을 받는 기능을 담당합니다.
  • 설명:
    • 이 메서드는 서버와의 연결이 확인된 상태에서 호출됩니다.
    • 요청 데이터는 "Hello, Server!"라는 간단한 문자열로 준비되어 있습니다. 이 문자열을 UTF-8로 인코딩하여 바이트 배열로 변환한 후 서버로 전송합니다.
    • WriteAsync 메서드를 사용하여 서버로 데이터를 비동기적으로 전송하고, FlushAsync 메서드로 전송된 데이터를 플러시하여 보냅니다.
    • 그 후, 서버로부터 응답을 ReadAsync 로 비동기적으로 받습니다. 응답은 바이트 배열로 읽어오고, 이를 다시 문자열로 변환하여 화면에 출력합니다.
    • 응답이 없다면 "서버 응답 없음" 메시지가 표시됩니다.
    • 만약 통신 중 오류가 발생하면 오류 메시지를 출력합니다.
반응형
Comments