用C#的Socket创建小型Web Server,核心是通过Socket监听指定端口,接收客户端的HTTP请求,解析请求内容后返回对应的HTTP响应。整个过程不需要依赖第三方Web框架,能帮助我们更清晰地理解HTTP协议和Socket通信的基本逻辑。

核心实现步骤
1. 初始化Socket并监听端口
首先需要创建一个Socket实例,绑定到指定的IP和端口,然后开启监听,等待客户端连接。这里选择使用TCP协议,因为HTTP协议是基于TCP的应用层协议。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace SimpleWebServer
{
class Program
{
static void Main(string[] args)
{
// 创建Socket实例,使用IPv4、流类型、TCP协议
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定到本地所有IP的8080端口
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8080);
serverSocket.Bind(endPoint);
// 开始监听,最大等待连接数为10
serverSocket.Listen(10);
Console.WriteLine("Web Server已启动,监听端口8080...");
// 循环接收客户端连接
while (true)
{
Socket clientSocket = serverSocket.Accept();
// 开启新线程处理客户端请求,避免阻塞主线程
Thread thread = new Thread(HandleClient);
thread.Start(clientSocket);
}
}
}
}2. 处理客户端请求并构造响应
当客户端连接到Socket后,需要读取客户端发送的HTTP请求内容,解析请求的方法和路径,然后构造对应的HTTP响应返回给客户端。HTTP响应的格式需要符合协议规范,包含状态行、响应头和响应体。
static void HandleClient(object obj)
{
Socket clientSocket = (Socket)obj;
try
{
// 接收客户端请求数据
byte[] buffer = new byte[1024 * 1024];
int length = clientSocket.Receive(buffer);
string requestStr = Encoding.UTF8.GetString(buffer, 0, length);
Console.WriteLine("收到请求:");
Console.WriteLine(requestStr);
// 简单解析请求路径,默认返回index.html内容
string responseBody = "<html><body><h1>欢迎访问小型Web Server</h1><p>这是通过C# Socket搭建的服务器返回的内容</p></body></html>";
string responseStr = "HTTP/1.1 200 OK\r\n" +
"Content-Type: text/html; charset=utf-8\r\n" +
$"Content-Length: {Encoding.UTF8.GetByteCount(responseBody)}\r\n" +
"\r\n" +
responseBody;
// 发送响应给客户端
byte[] responseBytes = Encoding.UTF8.GetBytes(responseStr);
clientSocket.Send(responseBytes);
}
catch (Exception ex)
{
Console.WriteLine($"处理请求出错:{ex.Message}");
}
finally
{
// 关闭客户端Socket
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}代码说明
上述代码中,Socket.Listen方法用于开启端口监听,Socket.Accept方法会阻塞等待客户端连接,当有连接进来时返回对应的客户端Socket。处理请求时,我们先接收客户端发送的字节数据,转成字符串后可以解析HTTP请求行的路径等信息,这里为了简化直接返回固定的HTML内容。
HTTP响应的格式必须正确,状态行HTTP/1.1 200 OK表示请求处理成功,Content-Type指定响应内容的类型,Content-Length指定响应体的字节长度,响应头和响应体之间需要通过\r\n分隔。
测试运行
将代码编译运行后,打开浏览器访问http://127.0.0.1:8080,就可以看到返回的HTML页面内容。如果需要支持更多请求路径或者静态文件访问,可以在解析请求路径的部分扩展逻辑,根据路径读取对应的文件内容作为响应体返回。
这个小型Web Server目前只支持非常基础的GET请求处理,没有考虑并发性能优化、异常处理完善等问题,仅作为Socket和HTTP协议结合的基础示例,开发者可以在此基础上根据需求扩展功能。
C#SocketWeb_ServerHTTP修改时间:2026-06-07 00:54:26