在很多的时候,我们写的应用程序需要提供一个信息说明或者告示功能,希望借助于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. NextCloud 17.0.1 升级到NextCloud 23.0.0

    NextCloud 版本过低使用时间过长,想升级一下. 问题记录及参考文档 本次采用离线升级(在线不能下载) 官网下载https://nextcloud.com/install/#  23.0.0最新 ...

  2. [746] Interlude Update 3

    [746] Interlude Update 3 Client 00 SendProtocolVersion 01 MoveBackwardToLocation 02 Say 03 RequestEn ...

  3. [Vue warn]: Do not use built-in or reserved HTML elements as component id: text 错误的解决办法

    引入的text 没用,要么注释掉,要么引用

  4. lua 调用C函数

    #include "tolua_fix.h" #include "WordFilter.h" #include "LuaBasicConversion ...

  5. Metasploit渗透测试框架二

    Metasploit基本使用方法 Metasploit基本命令 Metasploit程序需要使用Postgresql数据库. Postgresql是一种特性齐全的自由软件的对象-关系型数据库管理系统( ...

  6. 小白之Python-基础中的基础01

    Python-基础中的基础01 第一次写博客笔记,尝试并监督下自己. 每一天都值得期待! 20170803 -----------------华丽的分界线------------- Python之-- ...

  7. 直播带货源码,flutter 顶部滚动栏+页面

    直播带货源码,flutter 顶部滚动栏+页面 tabPage.dart import 'package:flutter/cupertino.dart';import 'package:flutter ...

  8. 解决habbybase 操作hbase报错TTransportException(type=4,message=’TSocket read 0 bytes)

    1.确认集群的协议是否一致,在连接的时候,改成一致的.例如集群配置的是TFramedTransport,TCompactProtocol 时 改成 connection = happybase.Con ...

  9. ADC采样信号RMS测量值的Verilog实现

    术语"RMS"代表"Root-Mean-Squared".大多数书籍将此定义为"产生与等效直流电源相同的加热效果的交流电量",或者沿着这些线 ...

  10. py10函数之嵌套-名称空间作用域

    # 函数是第一类对象:函数名指向的值可以被当中参数传递 # 1.函数名可以被传递# name = 'jason'# x = name# print(x)# print(id(x))# def func ...