写在前面

前面两篇文章分别介绍了基于原始socket的web服务器和基于tcpListener的web服务器,本篇文章将继续介绍另外一种基于HttpListener的。

HttpListener

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; namespace HttpListenerWebServer
{
class Program
{
static void Main(string[] args)
{
//httpListener提供一个简单,可通过编程方式控制的Http协议侦听器。此类不能被继承。
if (!HttpListener.IsSupported)
{
//该类只能在Windows xp sp2或者Windows server 200 以上的操作系统中才能使用,因为这个类必须使用Http.sys系统组件才能完成工作
//。所以在使用前应该先判断一下是否支持该类
Console.WriteLine("Windows xp sp2 or server 2003 is required to use the HttpListener class");
}
//设置前缀,必须以‘/’结尾
string[] prefixes = new string[] { "http://localhost:8888/" };
//初始化监听器
HttpListener listener = new HttpListener();
//将前缀添加到监听器
foreach (var item in prefixes)
{
listener.Prefixes.Add(item);
}
//判断是否已经启动了监听器,如果没有则开启
if (!listener.IsListening)
{
listener.Start();
}
//提示
Console.WriteLine("服务器已经启动,开始监听....");
while (true)
{
//等待传入的请求,该方法将阻塞进程,直到收到请求
HttpListenerContext context = listener.GetContext();
//取得请求的对象
HttpListenerRequest request = context.Request;
//打印状态行 请求方法,url,协议版本
Console.WriteLine("{0} {1} HTTP/{2}\r\n", request.HttpMethod, request.RawUrl, request.ProtocolVersion);
//打印接收类型
Console.WriteLine("Accept: {0}", string.Join(",", request.AcceptTypes));
//打印接收语言
Console.WriteLine("Accept-Language: {0}", string.Join(",", request.UserLanguages));
//打印编码格式
Console.WriteLine("Accept-Encoding: {0}", string.Join(",", request.Headers["Accept-Encoding"]));
//客户端引擎
Console.WriteLine("User-Agent: {0}", string.Join(",", request.UserAgent));
//是否长连接
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 responseBody = "<html><head><title>这是一个web服务器的测试</title></head><body><h1>Hello World.</h1></body></html>";
//设置响应头部内容,长度及编码
response.ContentLength64 = System.Text.Encoding.UTF8.GetByteCount(responseBody);
response.ContentType = "text/html; Charset=UTF-8";
//输出响应内容
System.IO.Stream output = response.OutputStream;
System.IO.StreamWriter sw = new System.IO.StreamWriter(output);
sw.Write(responseBody);
sw.Dispose();
break;
}
//关闭服务器
listener.Close();
Console.Read(); }
}
}

启动服务器,并在浏览器中输入:http://localhost:8888/ 回车

总结

在使用httplistener时,我们可以通过对象的属性获取到请求和响应的参数。

基于HttpListener的web服务器的更多相关文章

  1. 基于TcpListener的web服务器

    写在前面 上篇文章根据<asp.net 本质论>书上提供的例子,实现了一个简单的web服务器,本篇文章将介绍另一种实现方式——基于TcpListener的web服务器. TcpListen ...

  2. 基于OWin的Web服务器Katana发布版本3

    当 ASP.NET 首次在 2002 年发布时,时代有所不同. 那时,Internet 仍处于起步阶段,大约有 5.69 亿用户,每个用户平均每天访问 Internet 的时间为 46 分钟,大约有 ...

  3. Java 并发专题 : Executor详细介绍 打造基于Executor的Web服务器

    转载标明出处:http://blog.csdn.net/lmj623565791/article/details/26938985 继续并发,貌似并发的文章很少有人看啊~哈~ 今天准备详细介绍java ...

  4. c++ 网络编程(十一) LINUX下 初步制作基于HTTP的WEB服务器

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9663028.html HTTP概要 理解Web服务器端: 编写HTTP(超文本传输协议)服务器 ...

  5. 树莓派搭建基于flask的web服务器-通过移动端控制LED

    1.概述 在局域网内,基于flask搭建web服务,从而可以使用移动客户端访问该web服务.由于是flask新手,所以本次实现的web服务功能较为简单,即控制LED灯的开/关及闪烁. 2.准备工作 2 ...

  6. 基于nginx实现web服务器的双机热备

    1.适用场景 对于部署重要的服务,会使用两台服务器,互相备份,共同执行同一服务.当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务.双机热 ...

  7. HttpListener 实现web服务器

    一.使用方法 1. Start()方法 允许此实例接受传入的请求.即开始监听 2. Stop()方法 处理完所有当前排队的请求后关闭HttpListener对象 3. GetContext()方法  ...

  8. 基于TcpListerer的web服务器 和 基于HttpListerer的web服务器

    摘自<Asp.Net 本质论>作者:郝冠军 /* 为了简化基于TCP协议的监听程序,.NET在System.Net.Sockets命名空间中提供了TcpListerer类,使用它,在构造函 ...

  9. atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener

    atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs   ...

随机推荐

  1. 第一个WP8程序,照相机

    安装win8 64位,vs2013(包含wp8 sdk),百度各种得到学生开发者账户之后,终于可以试一下将自己的app部署到手机上的感觉了. 首先来个简单练练手的照相机功能 照相 即从主界面进入到照相 ...

  2. 20145208 《Java程序设计》第4周学习总结

    20145208 <Java程序设计>第4周学习总结 教材学习内容总结 继承 在学习指导中我了解到继承是符合DRY原则的,DRY(Don't repeat yourself),字面意思来看 ...

  3. Operators一句话介绍(RxJava版)

    Cold Observables 在第一个subscriber订阅后才执行事件发送的Observables,默认普通Observables都是这个类型 Cold Observables对于每个订阅的s ...

  4. 谈EntityFramework数据更新之技巧

    EntityFramework是一个很不错的ORM框架,一直都在使用.今天想跟大家分享以下EntityFramework数据更新方面的几个技巧: 1:如何new一个新实体去更新记录,而不是从数据库中查 ...

  5. ASP.NET 系列:RBAC权限设计

    权限系统的组成通常包括RBAC模型.权限验证.权限管理以及界面访问控制.现有的一些权限系统分析通常存在以下问题: (1)没有权限的设计思路 认为所有系统都可以使用一套基于Table设计的权限系统.事实 ...

  6. struts2+Hibernate实现用户登陆功能

    实现的功能,在登陆页面输入Username和PassWord后,将username和password通过Hibernate匹对数据库是否含有一样的username和password,若有则登陆进去,若 ...

  7. Bootstrap系列 -- 22. 按钮

    Bootstrap框架首先通过基础类名“.btn”定义了一个基础的按钮风格,然后通过“.btn-default”定义了一个默认的按钮风格.默认按钮的风格就是在基础按钮的风格的基础上修改了按钮的背景颜色 ...

  8. AngularJS开发指南3:Angular主要组成部分以及如何协同工作

    AngularJS的主要组成部分是: 启动(startup) - 展示“hello world!” 执行期(runtime) - AngularJS 执行期概览 作用域(scope) - 视图和控制器 ...

  9. 每天一个linux命令(46):ping命令

    Linux系统的ping 命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地 址192.168.1.1试试 ...

  10. 三维数组——与 宝玉QQ群讨论交流之二

    宝玉 12:27:35 这几天看了大部分大家交的作业,发现一个主要问题还是卡在对三维数组的理解上,之前把三维数组类比成三维空间可能会造成误导 宝玉 12:27:45 其实鞠老师解释的很好: 三维数组 ...