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

打印 上一主题 下一主题

主题 919|帖子 919|积分 2757

在.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监听器并等待连接:
  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. class SimpleWebServer
  8. {
  9.     private const int Port = 8080;
  10.     public static void Main()
  11.     {
  12.         TcpListener listener = new TcpListener(IPAddress.Any, Port);
  13.         listener.Start();
  14.         Console.WriteLine($"Server started at http://localhost:{Port}/");
  15.         while (true)
  16.         {
  17.             TcpClient client = listener.AcceptTcpClient();
  18.             HandleClientAsync(client).Wait();
  19.         }
  20.     }
  21.     private static async Task HandleClientAsync(TcpClient client)
  22.     {
  23.         NetworkStream stream = client.GetStream();
  24.         StreamReader reader = new StreamReader(stream, Encoding.UTF8);
  25.         StreamWriter writer = new StreamWriter(stream, Encoding.UTF8) { AutoFlush = true };
  26.         try
  27.         {
  28.             // 读取请求行
  29.             string requestLine = await reader.ReadLineAsync();
  30.             if (string.IsNullOrEmpty(requestLine))
  31.                 return;
  32.             Console.WriteLine($"Received request: {requestLine}");
  33.             // 解析请求行(为了简化,这里只处理GET请求)
  34.             string[] parts = requestLine.Split(' ');
  35.             if (parts.Length != 3 || parts[0] != "GET")
  36.             {
  37.                 SendErrorResponse(writer, 400, "Bad Request");
  38.                 return;
  39.             }
  40.             string path = parts[1];
  41.             if (path != "/")
  42.             {
  43.                 SendErrorResponse(writer, 404, "Not Found");
  44.                 return;
  45.             }
  46.             // 发送响应
  47.             SendResponse(writer, 200, "OK", "<html><body><h1>Hello, World!</h1></body></html>");
  48.         }
  49.         catch (Exception ex)
  50.         {
  51.             Console.WriteLine($"Error: {ex.Message}");
  52.             SendErrorResponse(writer, 500, "Internal Server Error");
  53.         }
  54.         finally
  55.         {
  56.             client.Close();
  57.         }
  58.     }
  59.     private static void SendResponse(StreamWriter writer, int statusCode, string statusMessage, string content)
  60.     {
  61.         writer.WriteLine($"HTTP/1.1 {statusCode} {statusMessage}");
  62.         writer.WriteLine("Content-Type: text/html; charset=UTF-8");
  63.         writer.WriteLine($"Content-Length: {content.Length}");
  64.         writer.WriteLine();
  65.         writer.Write(content);
  66.     }
  67.     private static void SendErrorResponse(StreamWriter writer, int statusCode, string statusMessage)
  68.     {
  69.         string content = $"<html><body><h1>{statusCode} {statusMessage}</h1></body></html>";
  70.         SendResponse(writer, statusCode, statusMessage, content);
  71.     }
  72. }
复制代码
这个示例代码创建了一个简单的Web服务器,监听8080端口。当客户端连接到服务器时,服务器会读取请求行,并根据请求路径返回相应的相应

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表