zoukankan      html  css  js  c++  java
  • (转)使用HttpListener实现简单Web服务器

    原文地址:http://www.cnblogs.com/wlitsoft/archive/2012/04/25/2469524.html

    不知园友们看没看上一篇博文,上篇将的是通过最底层的Socket(套接字)实现一个简单的Web服务器,是不是感觉有点繁琐,不要怕今天这篇博文就带你们认识一个新的实现方法,就是使用HttpListener

         
    为了进一步简化Http协议的监听器,.net为我们提供了HttpListener类,(为与命名空间System.Net).net在这个类中封装了一系列的的处理Http协议的工作。


    首先看一下MSDN中的定义:


      注意:此类在 .NET Framework 2.0 版中是新增的。



      提供一个简单的、可通过编程方式控制的 HTTP 协议侦听器。无法继承此类。


      用法:

        public sealed class HttpListener : IDisposable
    注意:该类只能在Win xp 或者win server 2003 以上的操作系统中才能使用,因为这个类必须使用Http.sys系统组件才能完成工作。
    所以在使用前应该先判断一下是否支持该类

    // 检查系统是否支持
                if (!HttpListener.IsSupported)
                {
                    throw new System.InvalidOperationException(
                        "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
                }

    下面罗列下本案例所用到的一些属性方法
    1. HttpListener.prefixes
    获取由此HttpListener对象处理的URI(统一资源标示符)前缀。



    复制代码
    // 注意前缀必须以 / 正斜杠结尾
    string[] prefixes = new string[] { "http://localhost:8080/" };
    // 创建监听器.
    HttpListener listener = new HttpListener();
    // 增加监听的前缀.
    foreach (string s in prefixes)
    {
           listener.Prefixes.Add(s);
    }

    复制代码

    2. Start()方法 允许此实例接受传入的请求。即开始监听


    3. Stop()方法 处理完所有当前排队的请求后关闭HttpListener对象


    4. GetContext()方法  等待传入的请求接受到请求时返回 就如同上一篇的Socket实现服务器一样
    有一个Accept()方法他俩个差不多都是等待传入的请求还有      
    一点就是GetContext()方法也会阻塞线程,当客户端的请求到达时,返回一个HttpListenerContext对象,处理客户端所发送过来的请求。
       
    4.1 Request 获取表示客户端资源的HttpListenerRequest对象。


              4.1.1 AcceptType 获取客户端接受到的MIME类型。
        4.1.2
    UserLanguages 获取语言信息。

              4.1.3 UserAgent
    获取客户端提供的用户代理。

              4.1.4 Headers
    获取在请求中发送的标头名称/值对的集合 --->获取HttpListenerRequest类没有提供的一下属性。


      4.2
    Response 该属性获得HttpListenerResponse对象,该对象将被发送到客户端以响应客户端的请求。


        4.2.1 ContextLength64 获取或设置响应中包括的正文数据的字节数。
             
    4.2.2 ContextType  获取或设置返回内容的 MIME 类型。


    通过流的方式将响应报文体的内容发送给客户端浏览器。


    下面是本文源码:



    复制代码
                // 检查系统是否支持
                if (!HttpListener.IsSupported)
                {
                    throw new System.InvalidOperationException(
                        "使用 HttpListener 必须为 Windows XP SP2 或 Server 2003 以上系统!");
                }
                // 注意前缀必须以 / 正斜杠结尾
                string[] prefixes = new string[] { "http://localhost:49152/" };
                // 创建监听器.
                HttpListener listener = new HttpListener();
                // 增加监听的前缀.
                foreach (string s in prefixes)
                {
                    listener.Prefixes.Add(s);
                }
                // 开始监听
                listener.Start();
                Console.WriteLine("监听中...");
                while (true)
                {
                    // 注意: GetContext 方法将阻塞线程,直到请求到达
                    HttpListenerContext context = listener.GetContext();
                    // 取得请求对象
                    HttpListenerRequest request = context.Request;
                    Console.WriteLine("{0} {1} HTTP/1.1", request.HttpMethod, request.RawUrl);
                    Console.WriteLine("Accept: {0}", string.Join(",", request.AcceptTypes));
                    Console.WriteLine("Accept-Language: {0}",
                        string.Join(",", request.UserLanguages));
                    Console.WriteLine("User-Agent: {0}", request.UserAgent);
                    Console.WriteLine("Accept-Encoding: {0}", request.Headers["Accept-Encoding"]);
                    Console.WriteLine("Connection: {0}",
                        request.KeepAlive ? "Keep-Alive" : "close");
                    Console.WriteLine("Host: {0}", request.UserHostName);
                    Console.WriteLine("Pragma: {0}", request.Headers["Pragma"]);
                    // 取得回应对象
                    HttpListenerResponse response = context.Response;
                    // 构造回应内容
                    string responseString
                        = @"<html>
                    <head><title>From HttpListener Server</title></head>
                    <body><h1>Hello, world.</h1></body>
                </html>";
                    // 设置回应头部内容,长度,编码
                    response.ContentLength64
                        = System.Text.Encoding.UTF8.GetByteCount(responseString);
                    response.ContentType = "text/html; charset=UTF-8";
                    // 输出回应内容
                    System.IO.Stream output = response.OutputStream;
                    System.IO.StreamWriter writer = new System.IO.StreamWriter(output);
                    writer.Write(responseString);
                    // 必须关闭输出流
                    writer.Close();
    
                    if (Console.KeyAvailable)
                        break;
                }
                // 关闭服务器
                listener.Stop();

    复制代码

    通过HttpWatch看一下报文吧



    看到报文后是不是和源码中指定的一些属性相同 啊
    (*^__^*) 嘻嘻…… 本篇就到这里  ( ^_^ )/~~拜拜


    要源码的狂点啊  
    重要的不是运行结果是我上面给你们罗列的知识点哈

  • 相关阅读:
    windows ntstatus.h 头文件
    Android Q 后台启动 Activity
    windows 删除文件夹所有文件夹及文件代码
    Android 加壳App Demo
    Android App 签名保护demo
    RXAndroidBle 记录网址
    c++ windows 获取系统时间
    js 代码保存
    day33 ansible
    day31 综合实时同步服务
  • 原文地址:https://www.cnblogs.com/fcsh820/p/2470233.html
Copyright © 2011-2022 走看看