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

.NET 下使用 C# 編寫下載器(一):WebClient 與 Socket 實作詳解

     編輯:關於C語言

前言

在 .NET 框架中,下載網路資源是常見需求。最簡單的方式是使用 WebClient 類別,但若需更底層的控制(如自訂 HTTP 標頭、處理特殊協議),則需直接操作 Socket。本文將透過範例代碼,示範這兩種方式的核心實作邏輯。

一、高層級抽象:WebClient 簡易下載

System.Net.WebClient 封裝了 HTTP 協議細節,幾行代碼即可完成下載:

using System.Net;
using System.Text;

WebClient client = new WebClient();
byte[] page = client.DownloadData("https://www.bianceng.cn");
string content = Encoding.UTF8.GetString(page);

此方式適合快速開發,但靈活性受限。

二、底層實作:Socket 手工構建 HTTP 請求

若需完全控制通訊流程,可直接使用 System.Net.Sockets.Socket。以下為完整流程:

1. 解析主機名稱並建立端點

string hostName = "www.nnn.Net";
int port = 80;
IPHostEntry ipInfo = Dns.GetHostEntry(hostName);
IPAddress ip = ipInfo.AddressList[0];
IPEndPoint hostEP = new IPEndPoint(ip, port);

2. 建立 Socket 並連線

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(hostEP);

3. 構建並發送 HTTP GET 請求

HTTP 協議要求請求報文以 \r\n\r\n 結尾:

string sendStr = "GET /tryst/default.ASP HTTP/1.1\r\nHost: " + hostName + "\r\nConnection: Close\r\n\r\n";
byte[] bytesSendStr = Encoding.ASCII.GetBytes(sendStr);
socket.Send(bytesSendStr, bytesSendStr.Length, 0);

4. 循環接收回應資料

string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes = 0;

while (true)
{
    bytes = socket.Receive(recvBytes, recvBytes.Length, 0);
    if (bytes <= 0) break;
    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
}

三、核心觀念總結

  • 下載本質:無論高層或低層 API,本質皆為「客戶端機制」——解析位址、建立連線、發送報文、接收回應。
  • 報文結構:GET 路徑 HTTP/1.1\r\nHost: 主機名\r\nConnection: Close\r\n\r\n 為標準 HTTP/1.1 請求格式。
  • 資料提取:Socket 回傳原始 HTML,若需解析特定內容,可搭配正則表達式處理,功能上等同 WebClient。

結語

理解 Socket 底層運作,有助於在需要自訂協議、處理非標準伺服器回應、或進行網路除錯時,具備更精細的控制力。實務上,優先使用 HttpClient(.NET Core/Standard 推薦)或 WebClient;僅在特殊情境下才手工操作 Socket。

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