首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 下載器實現:WebClient 簡易用法與 Socket 底層通訊詳解

     編輯:關於C#

高層 API:WebClient 一鍵下載

適用於簡單 GET/POST、小文件、無需精細控制的場景。

using (var client = new WebClient())
{
    // 同步下載位元組
    byte[] data = client.DownloadData("https://www.example.com");
    string html = Encoding.UTF8.GetString(data);

    // 或直接下載字串 (自動處理編碼)
    string html2 = client.DownloadString("https://www.example.com");
    
    // 下載到文件
    client.DownloadFile("https://example.com/file.zip", @"C:\file.zip");
}

常用屬性/事件

  • Encoding:設置響應編碼
  • Headers:添加請求頭 (User-Agent, Referer...)
  • Proxy:代理設置
  • DownloadProgressChanged:進度條
  • DownloadFileCompleted:異步完成回調

底層 Socket:HTTP 協議手工構建

理解 HTTP 原理、需要精細控制 (連接池、管線、自定義協議) 時使用。

核心流程

  1. DNS 解析域名 → IP
  2. 創建 TCP Socket 連接 80 端口
  3. 發送 HTTP 請求報文
  4. 接收響應報文 (循環讀取直到 0 字節)
  5. 解析響應頭與體

完整代碼

string host = "www.example.com";
int port = 80;

// 1. DNS 解析
IPHostEntry hostEntry = Dns.GetHostEntry(host);
IPAddress ip = hostEntry.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ip, port);

// 2. 建立連接
using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
    socket.Connect(endPoint);

    // 3. 構建 HTTP GET 請求
    string request = $"GET / HTTP/1.1\r\nHost: {host}\r\nConnection: Close\r\n\r\n";
    byte[] reqBytes = Encoding.ASCII.GetBytes(request);
    socket.Send(reqBytes);

    // 4. 接收響應
    string response = "";
    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = socket.Receive(buffer)) > 0)
    {
        response += Encoding.ASCII.GetString(buffer, 0, bytesRead);
    }

    Console.WriteLine(response);
}

關鍵細節

  • 請求行結尾:`\r\n` (CRLF),雙 CRLF 結束頭部
  • Host 頭:HTTP/1.1 必須
  • Connection: Close:告知服務端響應後關閉連接,否則需解析 Content-Length 或 Chunked 編碼
  • 編碼:頭部固定 ASCII,Body 需按 Content-Type charset 解碼
  • 異步模式:`BeginConnect`/`BeginSend`/`BeginReceive` 避免阻塞 UI 線程

WebClient vs Socket 對照

維度WebClientSocket
代碼量極少較多
協議支援HTTP/HTTPS/FTP任意 TCP 協議
自動處理重定向、壓縮、Cookie、編碼完全手工
控制力度低極高
效能 (高併發)一般可優化連接池、管線
適用場景簡單下載、API 調用爬蟲、代理、自定義協議、長連接

現代替代方案

  • HttpClient (NET 4.5+ / .NET Core 標準):異步優先、可復用、支援 `HttpRequestMessage` 精細控制
  • Flurl.Http、RestSharp:流式 API、自動反序列化
  • HttpWebRequest:舊版底層控制,已不推薦新代碼使用
// HttpClient 現代寫法
using (var http = new HttpClient())
{
    string html = await http.GetStringAsync("https://api.example.com/data");
    var obj = await http.GetFromJsonAsync<MyDto>("https://api.example.com/data");
}

理解 Socket 底層有助於排查網絡疑難雜症,但日常開發請優先使用 HttpClient。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved