c# HttpServer 的使用
在很多的时候,我们写的应用程序需要提供一个信息说明或者告示功能,希望借助于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 的使用的更多相关文章
- NodeJS 最快速搭建一个HttpServer
最快速搭建一个HttpServer 在目录里放一个index.html cd D:\Web\InternalWeb start http-server -i -p 8081
- 基于Netty4的HttpServer和HttpClient的简单实现
Netty的主页:http://netty.io/index.html 使用的Netty的版本:netty-4.0.23.Final.tar.bz2 ‐ 15-Aug-2014 (Stable, Re ...
- libevent源码分析:http-server例子
http-server例子是libevent提供的一个简单web服务器,实现了对静态网页的处理功能. /* * gcc -g -o http-server http-server.c -levent ...
- httpserver
改了下 # -*- coding:utf-8 -*- from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler HOST = &quo ...
- 一个简单的零配置命令行HTTP服务器 - http-server (nodeJs)
http-server 是一个简单的零配置命令行HTTP服务器, 基于 nodeJs. 如果你不想重复的写 nodeJs 的 web-server.js, 则可以使用这个. 安装 (全局安装加 -g) ...
- nodejs搭建http-server
很多时候我们都需要搭建一个简单的服务器,部署在IIS,阿帕奇,或者用nodejs,网上很多关于nodejs搭建server的文章,但都是要创建server.js,很麻烦, 在这里我分享一个创建ht ...
- 一、HTTPServer,RequestHandler,ServerHandler,Handler
1. HTTPServer,RequestHandler,ServerHandler,Handler 1.1 基本概念 HTTPServer主要是对传输控制层HTTP,TCP,S ...
- nodejs:本地文件夹http服务器http-server
一.已经安装nodejs的电脑,有一个方便通过http访问本地文件夹.文件夹服务器 static files over HTTP,并不是我们平常说的node那个web服务器哦 二.好处 可以方便实现跨 ...
- PHP使用libevent实现高性能httpServer
今天发现php也有一个libevent的扩展,安装后尝试下了一个webserver(httpserver), 发现性能还不错,逻辑很简单,每秒响应速度1800~4000次/s 代码如下 <?ph ...
- netty httpserver
netty也可以作为一个小巧的http服务器使用. package com.ming.netty.http.httpserver; import java.net.InetSocketAddress; ...
随机推荐
- idea字体的大小设置
idea字体大小设置 两个方法,滚轮.固定大小设置 固定字体大小 file--settings--editor--font--size 修改为需要大小字号,例如20,点击ok 菜单栏的大小设置也差不多 ...
- GPT和MBR分区格式
目前市面上磁盘有两个格式,一种是GPT(Master Boot Record)分区一种是MBR(Master Boot Record)分区. 像UEFI用于取代老旧的BIOS,而GPT则为的是取代老旧 ...
- 【GENERAL FRAMEWORK】总框架——持续更新
引: 鉴于目前挖的坑较多,未防止某些即将长期更新的博文出现烂尾,特设此框架 1.蓝桥杯(完结) 1.[蓝桥杯单片机组]LED.蜂鸣器与继电器--138-573的外设操作 ...
- Charles抓包工具详解
学习Charles能做什么: 能够用charles分析前后端问题 能够使用charles模拟弱网测试环境 能够使用charles断点构建异常的测试环境 Charles 简介 1.Charles是什么? ...
- Java包机制 与Javados 命令
package: 定义包 import : 导入包 com.wang.test.* :点* 是导入当前包下的所有类 @author :注释作者名 @version :注释版本号 @since ...
- ksfitappUI自动化(准备+安装环境)
一.原理+安装 https://blog.csdn.net/weixin_30624825/article/details/94803252 https://www.kancloud.cn/guanf ...
- C# Winform 多线程更新界面UI控件,解决界面卡顿问题(转)
前言 多线程刷新界面主要用到多线程,委托,线程安全.事件等一系列高难度的C#操作. 1.使用timer控件对要刷新的控件进行定时刷新 对刷新频率要求不高的时候,可以使用该方法. 2.刷新UI控件 在开 ...
- 查看Windows操作系统编码方式
chcp 编码表: 代码页 国家(地区)或语言 437 美国 708 阿拉伯文(ASMO 708)720 阿拉伯文(DOS)850 多语言(拉丁文 I) 852 中欧(DOS) - 斯拉夫语(拉丁文 ...
- mybatisplus SQL一对多
https://blog.csdn.net/Isyoubao/article/details/122212113 重点:<collection property="nspSchedul ...
- Echarts实现不均匀刻度的方法,自定义刻度(转)
原文地址 今天突然有个我们的咨询公司找我问一个echarts问题,这个问题确实值得一解决,很有意思. 问题是这样的.数据中有很多低于100的数值,但是最高值却能达到14000. data = [93. ...