架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8908|回复: 0

[资料] 基于HttpListener的Web服务器

[复制链接]
发表于 2015-12-21 11:00:26 | 显示全部楼层 |阅读模式

为了进一步简化HTTP协议的监听器,.NET在命名空间System.Net中提供了HttpListener类。伴随这个对象,.NET提供了一系列相关对象封装了HTTP的处理工作。注意,这个类使用Http.sys系统组件完成工作,所以,只有在WindowsXPSP2或者Server2003以上的操作系统中才能使用。

HttpListener类进一步简化了监听操作,仅需通过字符串的方法提供监听的地址、端口号以及虚拟路径,就可以开始监听工作。

开始监听后,GetContext方法将阻塞线程,当客户端的请求到达之后,HttpListener返回一个HttpListenerContext对象作为处理客户端请求的总代理,通过代理对象的Request属性,我们可以得到一个类型为HttpListenerRequest的代表请求参数的对象,这个对象将大多数请求参数进行了对象化,所以,我们可以通过它提供的一系列属性来获取请求参数。例如HttpListenerRequest的HttpMethod属性就提供了请求的方法类型。通过代理的Response属性,可以得到一个类型为HttpListenerResponse的回应处理对象,这个对象将回应的数据和操作进行了封装,使得我们大幅度简化了回应的编程工作量,工作过程如下所示:
//检查系统是否支持
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.KeepAliv e ? "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();

在使用HttpListener的时候,常用的请求和回应参数都变成了对象的属性,大幅度降低了编程的工作量。但是,大多数的参数还是需要通过Headers索引器来访问的,就像上例中的Accept-Encoding请求参数,我们就不能直接通过属性访问。




上一篇:css文件和js文件后面带一个问号
下一篇:美好的一天开始啦!!大家加油啊
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-3-29 18:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表