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 }
  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/heihaozi/p/webserver.html
Copyright © 2011-2022 走看看