在 .NET 框架中,下載網路資源是常見需求。最簡單的方式是使用 WebClient 類別,但若需更底層的控制(如自訂 HTTP 標頭、處理特殊協議),則需直接操作 Socket。本文將透過範例代碼,示範這兩種方式的核心實作邏輯。
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);
此方式適合快速開發,但靈活性受限。
若需完全控制通訊流程,可直接使用 System.Net.Sockets.Socket。以下為完整流程:
string hostName = "www.nnn.Net";
int port = 80;
IPHostEntry ipInfo = Dns.GetHostEntry(hostName);
IPAddress ip = ipInfo.AddressList[0];
IPEndPoint hostEP = new IPEndPoint(ip, port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(hostEP);
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);
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);
}
GET 路徑 HTTP/1.1\r\nHost: 主機名\r\nConnection: Close\r\n\r\n 為標準 HTTP/1.1 請求格式。WebClient。理解 Socket 底層運作,有助於在需要自訂協議、處理非標準伺服器回應、或進行網路除錯時,具備更精細的控制力。實務上,優先使用 HttpClient(.NET Core/Standard 推薦)或 WebClient;僅在特殊情境下才手工操作 Socket。