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

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

介绍如何通过 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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。