Web服务器

Web服务器示例:

  1         /// <summary>
2 /// 基于Socket的Web服务器
3 /// </summary>
4 private static void SocketWebServer()
5 {
6 // 取得本机的 loopback 网络地址,即 127.0.0.1
7 IPAddress address = IPAddress.Loopback;
8 // 创建可以访问的端点,49152 表示端口号,如果设置为 0,表示使用一个空闲的端口号
9 IPEndPoint endPoint = new IPEndPoint(address, 49152);
10 // 创建 socket,使用 IPv4 地址,传输控制协议 TCP,双向、可靠、基于连接的字节流
11 Socket socket = new Socket(
12 AddressFamily.InterNetwork,
13 SocketType.Stream,
14 ProtocolType.Tcp);
15 // 将 socket 绑定到一个端点上
16 socket.Bind(endPoint);
17 // 设置连接队列的长度
18 socket.Listen(10);
19 Console.WriteLine("开始监听, 端口号:{0}.", endPoint.Port);
20 while (true)
21 {
22 // 开始监听,这个方法会阻塞线程的执行,直到接收到一个客户端的连接请求
23 Socket client = socket.Accept();
24 // 输出客户端的地址
25 Console.WriteLine(client.RemoteEndPoint);
26 // 准备读取客户端请求的数据,读取的数据将保存在一个数组中
27 byte[] buffer = new byte[4096];
28 // 接收数据
29 int length = client.Receive(buffer, 4096, SocketFlags.None);
30 // 将请求的数据翻译为 UTF-8
31 System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
32 string requestString = utf8.GetString(buffer, 0, length);
33 // 显示请求的消息
34 Console.WriteLine(requestString);
35 // 回应的状态行
36 string statusLine = "HTTP/1.1 200 OK\r\n";
37 byte[] statusLineBytes = utf8.GetBytes(statusLine);
38 // 准备发送到客户端的网页
39 string responseBody
40 = @"<html>
41 <head><title>From HttpListener Server</title></head>
42 <body><h1>Hello, world.</h1></body>
43 </html>";
44 byte[] responseBodyBytes = utf8.GetBytes(responseBody);
45 // 回应的头部
46 string responseHeader =
47 string.Format(
48 "Content-Type: text/html;charset=UTF-8\r\nContent-Length: {0}\r\n",
49 responseBody.Length
50 );
51 byte[] responseHeaderBytes = utf8.GetBytes(responseHeader);
52
53 // 向客户端发送状态信息
54 client.Send(statusLineBytes);
55 // 向客户端发送回应头
56 client.Send(responseHeaderBytes);
57 // 头部与内容的分隔行
58 client.Send(new byte[] { 13, 10 });
59 // 向客户端发送内容部分
60 client.Send(responseBodyBytes);
61
62 // 断开与客户端的连接
63 client.Close();
64 if (Console.KeyAvailable)
65 break;
66 }
67 // 关闭服务器
68 socket.Close();
69 }
70
71 /// <summary>
72 /// 基于TcpListener的Web服务器
73 /// </summary>
74 private static void TcpListenerWebServer()
75 {
76 // 取得本机的 loopback 网络地址,即 127.0.0.1
77 IPAddress address = IPAddress.Loopback;
78 // 创建可以访问的端点,49152 表示端口号
79 IPEndPoint endPoint = new IPEndPoint(address, 49152);
80 // 创建 TCP 监听器
81 TcpListener newserver = new TcpListener(endPoint);
82 // 启动监听器
83 newserver.Start();
84 Console.WriteLine("开始监听, 端口号:{0}.", endPoint.Port);
85 while (true)
86 {
87 // 等待客户端连接
88 TcpClient newclient = newserver.AcceptTcpClient();
89 Console.WriteLine("已经建立连接!");
90 // 得到一个网络流
91 NetworkStream ns = newclient.GetStream();
92 // 处理过程中使用 UTF-8 编码
93 System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
94 byte[] request = new byte[4096];
95 int length = ns.Read(request, 0, 4096);
96 string requestString = utf8.GetString(request, 0, length);
97 Console.WriteLine(requestString);
98
99 // 状态行
100 string statusLine = "HTTP/1.1 200 OK\r\n";
101 byte[] statusLineBytes = utf8.GetBytes(statusLine);
102 // 准备发送到客户端的网页
103 string responseBody
104 = @"<html>
105 <head><title>From HttpListener Server</title></head>
106 <body><h1>Hello, world.</h1></body>
107 </html>";
108 byte[] responseBodyBytes = utf8.GetBytes(responseBody);
109 // 回应的头部
110 string responseHeader =
111 string.Format(
112 "Content-Type: text/html;charset=UTF-8\r\nContent-Length: {0}\r\n",
113 responseBody.Length
114 );
115 byte[] responseHeaderBytes = utf8.GetBytes(responseHeader);
116
117 // 输出回应的状态行
118 ns.Write(statusLineBytes, 0, statusLineBytes.Length);
119 // 输出回应的头部
120 ns.Write(responseHeaderBytes, 0, responseHeaderBytes.Length);
121 // 输出回应头部与内容之间的空行
122 ns.Write(new byte[] { 13, 10 }, 0, 2);
123 // 输出内容部分
124 ns.Write(responseBodyBytes, 0, responseBodyBytes.Length);
125
126 // 关闭与客户端的连接
127 newclient.Close();
128
129 if (Console.KeyAvailable)
130 break;
131 }
132 // 关闭服务器
133 newserver.Stop();
134 }
135
136 /// <summary>
137 /// 基于HttpListener的Web服务器
138 /// </summary>
139 private static void HttpListenerWebServer()
140 {
141 // 检查系统是否支持
142 if (!HttpListener.IsSupported)
143 {
144 throw new System.InvalidOperationException(
145 "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
146 }
147 // 注意前缀必须以 / 正斜杠结尾
148 string[] prefixes = new string[] { "http://localhost:49152/" };
149 // 创建监听器.
150 HttpListener listener = new HttpListener();
151 // 增加监听的前缀.
152 foreach (string s in prefixes)
153 {
154 listener.Prefixes.Add(s);
155 }
156 // 开始监听
157 listener.Start();
158 Console.WriteLine("监听中...");
159 while (true)
160 {
161 // 注意: GetContext 方法将阻塞线程,直到请求到达
162 HttpListenerContext context = listener.GetContext();
163 // 取得请求对象
164 HttpListenerRequest request = context.Request;
165 Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
166 Console.WriteLine("Accept: {0}", string.Join
167 (",", request.AcceptTypes));
168 Console.WriteLine("Accept-Language: {0}",
169 string.Join(",", request.UserLanguages));
170 Console.WriteLine("User-Agent: {0}", request.UserAgent);
171 Console.WriteLine("Accept-Encoding: {0}",
172 request.Headers["Accept-Encoding"]);
173 Console.WriteLine("Connection: {0}",
174 request.KeepAlive ? "Keep-Alive" : "close");
175 Console.WriteLine("Host: {0}", request.UserHostName);
176 Console.WriteLine("Pragma: {0}", request.Headers["Pragma"]);
177 // 取得回应对象
178 HttpListenerResponse response = context.Response;
179 // 构造回应内容
180 string responseString
181 = @"<html>
182 <head><title>From HttpListener Server</title></head>
183 <body><h1>Hello, world.</h1></body>
184 </html>";
185 // 设置回应头部内容,长度,编码
186 response.ContentLength64
187 = System.Text.Encoding.UTF8.GetByteCount(responseString);
188 response.ContentType = "text/html; charset=UTF-8";
189 // 输出回应内容
190 System.IO.Stream output = response.OutputStream;
191 System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
192 writer.Write(responseString);
193 // 必须关闭输出流
194 writer.Close();
195
196 if (Console.KeyAvailable)
197 break;
198 }
199 // 关闭服务器
200 listener.Stop();
201 }
原文地址:https://www.cnblogs.com/heihaozi/p/webserver.html