在很多的时候,我们写的应用程序需要提供一个信息说明或者告示功能,希望借助于HttpServer来发布一个简单的网站功能,但是又不想架一个臃肿的Http服务器功能,

这时候,标准框架提供的HttpServer功能或许是我们的选择。

一引入using System.Net;

二开始服务

 1  public class ServerHelper
2 {
3 HttpListener httpListener = new HttpListener();
4 public void Setup(int port=8080)
5 {
6 httpListener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
7 httpListener.Prefixes.Add(string.Format("http://*:{0}/",port));//如果发送到8080 端口没有被处理,则这里全部受理,+是全部接收
8 httpListener.Start();//开启服务
9
10 Receive();//异步接收请求
11 }
12
13 private void Receive()
14 {
15 httpListener.BeginGetContext(new AsyncCallback(EndReceive), null);
16 }
17
18 void EndReceive(IAsyncResult ar)
19 {
20 var context = httpListener.EndGetContext(ar);
21 Dispather(context);//解析请求
22 Receive();
23 }
24
25 RequestHelper RequestHelper;
26 ResponseHelper ResponseHelper;
27 void Dispather(HttpListenerContext context)
28 {
29 HttpListenerRequest request= context.Request;
30 HttpListenerResponse response = context.Response;
31 RequestHelper = new RequestHelper(request);
32 ResponseHelper = new ResponseHelper(response);
33 RequestHelper.DispatchResources(fs => {
34 ResponseHelper.WriteToClient(fs);// 对相应的请求做出回应
35 });
36 }
37 }

三解析请求

 1 public class RequestHelper
2 {
3 private HttpListenerRequest request;
4 public RequestHelper(HttpListenerRequest request)
5 {
6 this.request = request;
7 }
8 public Stream RequestStream { get; set; }
9 public void ExtracHeader()
10 {
11 RequestStream= request.InputStream;
12 }
13
14 public delegate void ExecutingDispatch(FileStream fs);
15 public void DispatchResources(ExecutingDispatch action)
16 {
17 var rawUrl = request.RawUrl;//资源默认放在执行程序的wwwroot文件下,默认文档为index.html
18 string filePath = string.Format(@"{0}/wwwroot{1}", Environment.CurrentDirectory, rawUrl);//这里对应请求其他类型资源,如图片,文本等
19 if (rawUrl.Length==1)
20 filePath = string.Format(@"{0}/wwwroot/index.html", Environment.CurrentDirectory);//默认访问文件
21 try {
22 if (File.Exists(filePath))
23 {
24 FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);
25
26 action?.Invoke(fs);
27
28 }
29 }
30 catch { return; }
31 }
32 public void ResponseQuerys()
33 {
34 var querys = request.QueryString;
35 foreach (string key in querys.AllKeys)
36 {
37 VarityQuerys(key,querys[key]);
38 }
39 }
40
41 private void VarityQuerys(string key,string value)
42 {
43 switch(key)
44 {
45 case "pic":Pictures(value); break;
46 case "text":Texts(value); break;
47 default:Defaults(value); break;
48 }
49 }
50
51 private void Pictures(string id)
52 {
53
54 }
55
56 private void Texts(string id)
57 {
58
59 }
60
61 private void Defaults(string id)
62 {
63
64 }
65
66 }

四回应请求

public class ResponseHelper
{
private HttpListenerResponse response;
public ResponseHelper(HttpListenerResponse response)
{
this.response = response;
OutputStream = response.OutputStream; }
public Stream OutputStream { get; set; }
public class FileObject
{
public FileStream fs;
public byte[] buffer;
}
public void WriteToClient(FileStream fs)
{
response.StatusCode = 200;
byte[] buffer = new byte[1024];
FileObject obj = new FileObject() { fs = fs, buffer = buffer };
fs.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(EndWrite), obj);
}
void EndWrite(IAsyncResult ar)
{
var obj = ar.AsyncState as FileObject;
var num= obj.fs.EndRead(ar);
OutputStream.Write(obj.buffer,0,num);
if (num < 1) {
          obj.fs.Close(); //关闭文件流
          OutputStream.Close();//关闭输出流,如果不关闭,浏览器将一直在等待状态
          return;
        }
obj.fs.BeginRead(obj.buffer, 0, obj.buffer.Length, new AsyncCallback(EndWrite), obj);
}
}

测试结果:

准备的index.html,里面包含了图片和普通html

资源目录:

浏览器进行访问测试:

总结:

本文只是对httpserver进行简单的测试,简单的进行请求和回应的梳理,对于想要复杂的浏览器功能,需要详细的研究下其他浏览器的工作原理

c# HttpServer 的使用的更多相关文章

  1. NodeJS 最快速搭建一个HttpServer

    最快速搭建一个HttpServer 在目录里放一个index.html cd D:\Web\InternalWeb start http-server -i -p 8081

  2. 基于Netty4的HttpServer和HttpClient的简单实现

    Netty的主页:http://netty.io/index.html 使用的Netty的版本:netty-4.0.23.Final.tar.bz2 ‐ 15-Aug-2014 (Stable, Re ...

  3. libevent源码分析:http-server例子

    http-server例子是libevent提供的一个简单web服务器,实现了对静态网页的处理功能. /* * gcc -g -o http-server http-server.c -levent ...

  4. httpserver

    改了下 # -*- coding:utf-8 -*- from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler HOST = &quo ...

  5. 一个简单的零配置命令行HTTP服务器 - http-server (nodeJs)

    http-server 是一个简单的零配置命令行HTTP服务器, 基于 nodeJs. 如果你不想重复的写 nodeJs 的 web-server.js, 则可以使用这个. 安装 (全局安装加 -g) ...

  6. nodejs搭建http-server

      很多时候我们都需要搭建一个简单的服务器,部署在IIS,阿帕奇,或者用nodejs,网上很多关于nodejs搭建server的文章,但都是要创建server.js,很麻烦, 在这里我分享一个创建ht ...

  7. 一、HTTPServer,RequestHandler,ServerHandler,Handler

    1.      HTTPServer,RequestHandler,ServerHandler,Handler 1.1       基本概念 HTTPServer主要是对传输控制层HTTP,TCP,S ...

  8. nodejs:本地文件夹http服务器http-server

    一.已经安装nodejs的电脑,有一个方便通过http访问本地文件夹.文件夹服务器 static files over HTTP,并不是我们平常说的node那个web服务器哦 二.好处 可以方便实现跨 ...

  9. PHP使用libevent实现高性能httpServer

    今天发现php也有一个libevent的扩展,安装后尝试下了一个webserver(httpserver), 发现性能还不错,逻辑很简单,每秒响应速度1800~4000次/s 代码如下 <?ph ...

  10. netty httpserver

    netty也可以作为一个小巧的http服务器使用. package com.ming.netty.http.httpserver; import java.net.InetSocketAddress; ...

随机推荐

  1. [记] OpenCV4 源码编译安装 | 记录

    OpenCV4 源码编译安装 | 记录 参考资料 官方文档:https://docs.opencv.org/4.x/d7/d9f/tutorial_linux_install.html 环境 wsl2 ...

  2. 25js String(字符串)对象

    <!DOCTYPE html> <html lang="en">   <head>     <meta charset="UTF ...

  3. Charles抓包工具详解

    学习Charles能做什么: 能够用charles分析前后端问题 能够使用charles模拟弱网测试环境 能够使用charles断点构建异常的测试环境 Charles 简介 1.Charles是什么? ...

  4. (1028) 权限,chmod、chgrp、chown详解

    https://www.cnblogs.com/Berryxiong/p/6193866.html 例1: $ chgrp - R book /opt/local /book 改变/opt/local ...

  5. 51电子-STC89C51开发板:目录

    51电子(我要电子:www.51dz.com),是国内最早一批的电子类相关网站,在深圳有实体店. 这个系列文章以 STC89C51 来做笔记,讲解使用过程. --------------------- ...

  6. JS 代码片段 / 预编译/预解析 /执行上下文/ECG/EC/ECS/GO/VO/AO

    代码段概念 一个 script 就是一个代码段 在一个页面中可以有多个代码段 每一个代码段, 彼此独立的, 如果上面的代码段报错了, 不会影响下一个代码段 referenceError 引用错误 下面 ...

  7. 4.git的指令应用

    1.stash 应用:   应用场景:在当前分支开发代码,开发到一半,代码没有提交,你想在当前分支的基础上切换到别的分支:或者创建新的分支,所以需要把当前开发的内容进行藏匿起来. 1.1藏匿指令:   ...

  8. 赤菟V307与Matlab的串口通信

    赤菟V307与Matlab的串口通信 赤菟V307(CH32V307)是一款RISC-V内核的MCU,搭载的是沁恒自研RISC-V内核青稞V4F,最高主频144MHz,支持单精度浮点运算(FPU). ...

  9. 遇到端口占用无法启动IIS Express服务器

    报错图片: 上图所述由于端口被占用无法完成IIS Express的输出 这时候要考虑到自己在Windows的IIS 是不是配置了该端口? 很明显,就是配置了一个8091的端口且还在启动中,这时候要先将 ...

  10. java使用MVC编程模型实现1+到100图形界面

    MVC概念 MVC编程模型是可以说从提出到现在经久不败,是一种先进的设计结构.能很好的体现个人分工,从而实现前后端分离. M(Model):模型:存储数据的对象.后端操作数据库的. V(View):视 ...