zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    R: 聚类分析
    R: 主成分分析 ~ PCA(Principal Component Analysis)
    R: 关于 ggplot2 的初探
    R: 字符串处理包:stringr
    R: 用 R 查看、管理文件(夹)
    R: 关于文件 文件夹的处理:file.show() dir.create().....
    R: 绘图 pie & hist
    R: 绘图 barplot
    R: 对向量中的每个元素,检查其是否包含某个“单词”
    R: 一页显示多张图的方法
  • 原文地址:https://www.cnblogs.com/heihaozi/p/webserver.html
Copyright © 2011-2022 走看看