1.代码
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading.Tasks;namespace WebServer{ /// <summary> /// 使用Socket实现一个简单的Web服务器 /// 该服务器向请求的浏览器返回一个静态的HTML /// /// 这里只是简单实现了一个web服务器的功能, /// 当然实际的Web服务器通过用户的发来的Http请求中获得请求文件类型, /// 请求文件名以及请求目录等信息, /// 然后Web服务器根据这些请求信息从服务器的物理目录中寻找请求的文件, /// 如果在服务器中找到请求的文件,然后服务器把响应内容发送给客户端。 /// 这里只是通过这个简单的Web服务器让大家理解请求/响应模型以及Web服务器的工作原理, /// 一些复杂的Web服务器也是在此基础进行一些其他功能的扩展。 /// </summary> class Program { static void Main(string[] args) { //获得本机IP地址,即127.0.0.1 IPAddress localaddress = IPAddress.Loopback; //创建可以访问的端点,49135表示端口号,如果这里设置为0,表示使用一个由系统分配的空闲端口号 IPEndPoint endpoint = new IPEndPoint(localaddress, 49135); //创建Socket对象,使用IPv4地址,数据通信类型为数据流,传输控制协议为Tcp Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //将Socket绑定到端点上 socket.Bind(endpoint); //将Socket实例置于侦听状态,设置连接队列长度 socket.Listen(10); while (true) { Console.WriteLine("Wait an connect Request..."); //开始监听,这个方法会阻塞线程的执行,直到接收到一个客户端的连接请求 Socket clientsocket = socket.Accept(); //输出客户端地址 Console.WriteLine("Client Address is:{0}", clientsocket.RemoteEndPoint); //把客户端的请求数据读入保存到一个数组中 byte[] buffer = new byte[2048]; int receivelength = clientsocket.Receive(buffer, 2048, SocketFlags.None); string requeststring = Encoding.UTF8.GetString(buffer, 0, receivelength); //在服务器端输出请求的消息 Console.WriteLine(requeststring); //服务器端做出相应的内容 //相应的行状态 string statusLine = "HTTP/1.1 200 OK\r\n"; byte[] responseStatusLineBytes = Encoding.UTF8.GetBytes(statusLine); string responseBody = "<html><head><title>Default Page</title></head><body><h1>Welcome you!</h1></body></html>"; string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n", responseBody.Length); byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader); byte[] responseBodyBytes = Encoding.UTF8.GetBytes(responseBody); //向客户端发送行状态 clientsocket.Send(responseStatusLineBytes); //向客户端发送回应头信息 clientsocket.Send(responseHeaderBytes); //发送头部和内容的空行 clientsocket.Send(new byte[] { 13, 10 }); //向客户端发送主体部分 clientsocket.Send(responseBodyBytes); //断开连接 clientsocket.Close(); Console.ReadKey(); break; } //关闭服务器 socket.Close(); } }}using System;using System.Collections.Ge