C# Socket 编程基础:手动实现 HTTP GET 请求
介绍如何通过 C# 底层 Socket 类手动构建 TCP 连接,发送标准的 HTTP GET 请求并处理服务器的返回数据流。
使用 Socket 类进行 HTTP 通讯
虽然在实际开发中通常推荐使用 HttpClient 等高级封装库来处理 Web 请求,但理解底层的 Socket 机制对于掌握 TCP/IP 协议至关重要。以下示例展示了如何不使用 HTTP 客户端类,而是直接通过字节流的方式向 HTTP 服务器发起请求并获取 HTML 页面源码。
第1步:定义请求参数与编码
首先需要确定目标服务器地址,并准备用于转换数据的 ASCII 编码对象。我们将构建一个符合 HTTP/1.1 规范的请求字符串,包含请求方法、路径、主机头以及连接控制头。
public string DoSocketGet(string server)
{
// 设置变量和用于写入服务器的字符串
Encoding ASCII = Encoding.ASCII;
// 构建 HTTP GET 请求报文
// 注意:实际场景中可能需要动态调整 Host 和 Path
string Get = "GET / HTTP/1.1\r\nHost: " + server + "\r\nConnection: Close\r\n\r\n";
byte[] ByteGet = ASCII.GetBytes(Get);
byte[] RecvBytes = new byte[256];
string strRetPage = null;
第2步:解析服务器地址并建立 TCP 连接
使用 Dns.Resolve 将域名解析为 IP 地址列表中的第一个地址,并将其与默认 HTTP 端口(80)组合成 IPEndPoint。随后创建基于 IPv4 和 TCP 协议的 Socket 实例,并尝试连接到目标端点。
// 获取 DNS 解析后的第一个 IP 地址
IPAddress hostadd = Dns.Resolve(server).AddressList[0];
IPEndPoint EPhost = new IPEndPoint(hostadd, 80);
// 创建 TCP Socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 连接到主机
s.Connect(EPhost);
if (!s.Connected)
{
return "Unable to connect to host";
}
第3步:发送请求数据
连接成功后,使用 Send 方法将之前准备好的字节数组发送给服务器。此时使用 SocketFlags.None 标志表示没有特殊标记要求。
// 发送 GET 文本到主机
s.Send(ByteGet, ByteGet.Length, SocketFlags.None);
第4步:循环接收并处理响应数据
HTTP 响应可能分块到达,因此需要在一个循环中使用 Receive 方法读取数据,直到返回值小于或等于 0(表示流结束)。每次接收的数据追加到结果字符串中。
// 接收页面,循环直到收到所有字节
Int32 bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
strRetPage = "Default HTML page on " + server + ":\r\n";
strRetPage += ASCII.GetString(RecvBytes, 0, bytes);
while (bytes > 0)
{
bytes = s.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None);
strRetPage += ASCII.GetString(RecvBytes, 0, bytes);
}
// 可选:立即关闭连接
// s.Close();
return strRetPage;
}
上述代码提供了一个完整的逻辑闭环,从连接建立到数据回收。需要注意的是,该示例仅适用于简单的 HTTP GET 场景,未处理 HTTPS 加密、复杂头部验证或非标准编码情况。在实际生产环境中,建议结合异常处理机制以应对网络超时或解析错误。
以上就是使用 C# Socket 类开发基础 HTTP 通讯的详细内容,更多关于 C# 网络编程的资料请关注本站其它相关文章!免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









