60 네트워크 프로그래밍 맛보기

  • 5 minutes to read

C#에서 다루는 데이터는 인메모리, 파일, XML과 JSON을 포함하여 여러 데이터를 인터넷과 같은 네트워크를 통해서 주고받을 수 있습니다. 이번 강의는 웹 프로그래밍은 아니지만, 네트워크를 통해서 데이터를 주고받는 간단한 기능을 살펴보겠습니다.

> // System.Net.Http 네임스페이스: 최신 HTTP 응용 프로그램의 프로그래밍 인터페이스를 제공

60.1 HttpClient 클래스로 웹의 데이터를 가져오기

닷넷에서 제공하는 HttpClient 클래스를 사용하면 인터넷에 연결되어 있는 네트워크 상의 데이터를 가져오거나 전송할 수 있습니다. 다음 예제는 닷넷 코어 콘솔 프로젝트에서 http://www.microsoft.com 경로의 HTML 문서를 읽어 콘솔에 출력하는 내용입니다.

코드: HttpClientDemo.cs

// HttpClientDemo/HttpClientDemo.cs
using System;
using System.Net.Http;
using System.Threading.Tasks;

class HttpClientDemo
{
    static async Task Main()
    {
        //[1] HttpClient 개체 생성
        HttpClient httpClient = new HttpClient();

        //[2] GetAsync() 메서드 호출
        HttpResponseMessage httpResponseMessage =
            await httpClient.GetAsync("http://www.microsoft.com/");

        //[3] HTML 가져오기 
        string responseBody = await httpResponseMessage.Content.ReadAsStringAsync();

        //[4] 출력
        Console.WriteLine(responseBody);
    }
}

출력 내용은 때에 따라서 다르기에 따로 표현하지 않았습니다. HTML로 다운로드된 문자열은 웹 브라우저와 같은 프로그램에서는 HTML을 실행해서 보여주지만, 이번 예제에서는 그대로 텍스트로 화면에 출력됩니다. GetAsync()와 같이 해당 URL로 데이터를 전송하는 PostAsync()와 같은 메서드도 제공합니다. HttClient 클래스와 같은 API는 때에 따라서 더 향상된 클래스로 추가되어 제공되기도 합니다.

60.1.1 참고: WebClient 클래스로 웹 데이터 읽어오기

이번에는 WebClient 클래스를 사용해보겠습니다. 다음 경로의 URL은 원하는 값으로 변경해서 사용하면 됩니다. 출력 결과물은 따로 표현하지 않겠습니다.

코드: WebClientDemo.cs

// WebClientDemo.cs
using System;
using System.Net;
using System.Threading;

class WebClientDemo
{
    static void Main()
    {
        WebClient client = new WebClient();

        // 동기적으로 출력
        string google = client.DownloadString("http://www.google.co.kr");
        Console.WriteLine("Google: " + google.Substring(0, 10)); // 20자만 가져오기

        string naver = client.DownloadString(new Uri("http://www.naver.com"));
        Console.WriteLine("Naver: " + naver.Substring(0, 10));

        // 비동기적으로 출력
        client.DownloadStringAsync(new Uri("http://www.dotnetkorea.com"));
        client.DownloadStringCompleted += Client_DownloadStringCompleted;
        Thread.Sleep(3000); // 잠시 대기
    }

    private static void Client_DownloadStringCompleted(object sender,
        DownloadStringCompletedEventArgs e)
    {
        string r = e.Result.Replace("\n", "").Substring(0, 10);
        Console.WriteLine($"DotNetKorea: {r}");
    }
}

참고: HttpWebRequest 클래스를 사용하여 웹 페이지 가져오기

이번에는 HttpWebRequest 클래스를 사용하여 웹 페이지의 HTML을 가져오는 예제를 살펴보겠습니다.
아래 코드에서 url 변수의 값을 원하는 주소로 변경하여 사용할 수 있습니다.
출력 결과는 별도로 설명하지 않겠습니다.

코드: HttpWebRequestDemo.cs

// HttpWebRequestDemo.cs
using System;
using System.IO;
using System.Net;

class HttpWebRequestDemo
{
    static void Main()
    {
        // 지정된 URL에서 HTML 문서를 가져온다고 가정
        string url = "http://www.google.com";

        var req = WebRequest.CreateHttp(url); // HttpWebRequest.CreateHttp(url) 대신 사용 가능
        using (var res = req.GetResponse() as HttpWebResponse)
        using (var stream = res.GetResponseStream())
        using (var sr = new StreamReader(stream))
        {
            string html = sr.ReadToEnd();
            Console.WriteLine(html);
        }
    }
}

HttpClient 클래스

WebClient 클래스가 레거시(구식) API라면, HttpClient 클래스는 최신 네트워킹 프로그래밍을 위한 권장되는 클래스입니다.
비동기 방식으로 HTTP 요청을 수행할 수 있으며, asyncawait 키워드를 활용하면 효율적인 네트워크 처리가 가능합니다.

using System;
using System.Net.Http;
using System.Threading.Tasks;

class HttpClientExample
{
    static async Task Main()
    {
        using var client = new HttpClient();
        
        string url = "http://www.example.com";
        var response = await client.GetAsync(url);
        
        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        else
        {
            Console.WriteLine($"Error: {response.StatusCode}");
        }
    }
}

위 코드에서는 HttpClient를 사용하여 지정된 URL에서 데이터를 가져오고, HTTP 응답이 성공적인 경우(IsSuccessStatusCodetrue일 경우) 내용을 출력합니다.
이처럼 HttpClient는 보다 간결하고 효율적인 방식으로 HTTP 요청을 처리할 수 있도록 설계되었습니다.

장 요약

닷넷 API 브라우저에서보면 System.Net.Http 네임스페이스를 통해서 많은 수의 API를 제공합니다. 이 역시 모두 다 알 수는 없고, 그럴 필요는 없습니다. C# 콘솔 기반이 아닌 웹과 데스크톱, 모바일 앱 등으로 확장해 나가면 더 쉽게 사용할 수 있는 환경이 됩니다. 네트워크 프로그래밍에 대한 더 자세한 내용은 우선 ASP.NET과 같은 웹 프로그래밍을 먼저 접한 후 Microsoft Learn 등의 네트워크 관련 API를 참고하길 권장합니다. 이번 장도 짧게 마무리 짓도록 하겠습니다.

더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com