用 C# 自己动手编写一个 Web 服务器

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

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

第一步:理解HTTP协议

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

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

HTTP响应由状态行、响应头部和响应体组成。状态行包含HTTP协议版本、状态码和状态消息。响应头部包含关于响应的附加信息,如Content-TypeContent-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", "<html><body><h1>Hello, World!</h1></body></html>");
        }
        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 = $"<html><body><h1>{statusCode} {statusMessage}</h1></body></html>";
        SendResponse(writer, statusCode, statusMessage, content);
    }
}

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

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用C#编写Web服务器的基本步骤: 1.创建一个TcpListener对象,该对象将侦听传入的连接请求。 2.使用AcceptTcpClient方法接受传入的连接请求,并创建一个TcpClient对象来处理连接。 3.使用NetworkStream对象读取和写入数据。 4.解析HTTP请求,包括请求方法,请求路径和请求头。 5.根据请求路径确定要提供的内容,并将内容作为HTTP响应发送回客户端。 下面是一个简单的C# Web服务器示例,它可以响应GET请求并返回HTML内容: ```csharp using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; class Program { static void Main(string[] args) { TcpListener listener = new TcpListener(IPAddress.Any, 8080); listener.Start(); Console.WriteLine("Server started on port 8080"); while (true) { TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("Client connected"); NetworkStream stream = client.GetStream(); StreamReader reader = new StreamReader(stream); StreamWriter writer = new StreamWriter(stream); string request = reader.ReadLine(); Console.WriteLine("Request: " + request); string[] tokens = request.Split(' '); string method = tokens[0]; string path = tokens[1]; if (method == "GET") { if (path == "/") { writer.WriteLine("HTTP/1.0 200 OK"); writer.WriteLine("Content-Type: text/html"); writer.WriteLine(); writer.WriteLine("<html><body><h1>Hello, world!</h1></body></html>"); } else { writer.WriteLine("HTTP/1.0 404 Not Found"); } } else { writer.WriteLine("HTTP/1.0 501 Not Implemented"); } writer.Flush(); client.Close(); Console.WriteLine("Client disconnected"); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伴之则安博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值