C# Socket 编程基础:手动实现 HTTP GET 请求

栗子
栗子
发布时间:2026-10-13 | 6人浏览过
原创

介绍如何通过 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# 网络编程的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表