用 C 用醋浇兰花正确方法
创始人
2025-07-14 02:41:33
0

在.NET世界中,C#是一种功能强大的编程语言,常被用于构建各种类型的应用程序,包括Web服务器。虽然在实际生产环境中,我们通常会使用成熟的Web服务器软件(如IIS、Kestrel等),但了解如何用C#从头开始构建一个简单的Web服务器,对于深入理解HTTP协议和网络编程是非常有价值的。

本文将指导你使用C#编写一个简单的Web服务器,并包含具体的代码实现。

第一步:理解HTTP协议

在编写Web服务器之前,我们需要对HTTP协议有一个基本的了解。HTTP是一种无状态的、基于请求和响应的协议。客户端(如Web浏览器)发送HTTP请求到服务器,服务器处理请求并返回HTTP响应。

HTTP请求由请求行、请求头部和请求体组成。请求行包含请求方法(GET、POST等)、请求URL和HTTP协议版本。请求头部包含关于请求的附加信息,如Host、User-Agent等。请求体包含实际发送给服务器的数据,通常用于POST请求。

HTTP响应由状态行、响应头部和响应体组成。状态行包含HTTP协议版本、状态码和状态消息。响应头部包含关于响应的附加信息,如Content-Type、Content-Length等。响应体包含服务器返回给客户端的实际数据。

第二步:创建TCP监听器

在C#中,我们可以使用TcpListener类来创建一个TCP监听器,用于监听传入的HTTP请求。以下是一个简单的示例代码,展示如何创建TCP监听器并等待连接:

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

class SimpleWebServer
{
    private const int Port = 8080;

    public static void Main()
    {
        TcpListener listener = new TcpListener(IPAddress.Any, Port);
        listener.Start();
        Console.WriteLine($"Server started at http://localhost:{Port}/");

        while (true)
        {
            TcpClient client = listener.AcceptTcpClient();
            HandleClientAsync(client).Wait();
        }
    }

    private static async Task HandleClientAsync(TcpClient client)
    {
        NetworkStream stream = client.GetStream();
        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
        StreamWriter writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true };

        try
        {
            // 读取请求行
            string requestLine = await reader.ReadLineAsync();
            if (string.IsNullOrEmpty(requestLine))
                return;

            Console.WriteLine($"Received request: {requestLine}");

            // 解析请求行(为了简化,这里只处理GET请求)
            string[] parts = requestLine.Split(' ');
            if (parts.Length != 3 || parts[0] != "GET")
            {
                SendErrorResponse(writer, 400, "Bad Request");
                return;
            }

            string path = parts[1];
            if (path != "/")
            {
                SendErrorResponse(writer, 404, "Not Found");
                return;
            }

            // 发送响应
            SendResponse(writer, 200, "OK", "

Hello, World!

"); } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); SendErrorResponse(writer, 500, "Internal Server Error"); } finally { client.Close(); } } private static void SendResponse(StreamWriter writer, int statusCode, string statusMessage, string content) { writer.WriteLine($"HTTP/1.1 {statusCode} {statusMessage}"); writer.WriteLine("Content-Type: text/html; charset=UTF-8"); writer.WriteLine($"Content-Length: {content.Length}"); writer.WriteLine(); writer.Write(content); } private static void SendErrorResponse(StreamWriter writer, int statusCode, string statusMessage) { string content = $"

{statusCode} {statusMessage}

"; SendResponse(writer, statusCode, statusMessage, content); } }

这个示例代码创建了一个简单的Web服务器,监听8080端口。当客户端连接到服务器时,服务器会读取请求行,并根据请求路径返回相应的响应。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...