编写一个简单的Web Server其实是轻而易举的。如果我们只是想托管一些HTML页面,我们可以这么实现:

在VS2013中创建一个C# 控制台程序

编写一个字符串扩展方法类,主要用于在URL中截取文件名

ExtensionMethods.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace webserver1
{
/// <summary>
/// 一些有用的字符串扩展方法
/// </summary>
public static class ExtensionMethods
{
/// <summary>
/// 返回给定字符串左侧的字串或是整个源字符串
/// </summary>
/// <param name="src">源字符串</param>
/// <param name="s">对比字符串</param>
/// <returns></returns>
public static string LeftOf(this String src, string s)
{
string ret = src;
int idx = src.IndexOf(s);
if (idx != -) { ret = src.Substring(, idx); }
return ret;
} /// <summary>
/// 返回给定字符串右侧的字串或是整个源字符串
/// </summary>
/// <param name="src">源字符串</param>
/// <param name="s">对比字符串</param>
/// <returns></returns>
public static string RightOf(this String src, string s)
{
string ret = String.Empty;
int idx = src.IndexOf(s);
if (idx != -) {
ret = src.Substring(idx + s.Length);
} return ret;
} }
}

在入口程序中开启HTTP监听

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.IO; namespace webserver1
{
class Program
{
static Semaphore sem; static void Main(string[] args)
{
//支持模拟20个连接
sem = new Semaphore(, ); HttpListener listener = new HttpListener();
string url = "http://localhost/";
listener.Prefixes.Add(url);
listener.Start(); Task.Run(() =>
{
while (true) {
sem.WaitOne(); StartConnectionListener(listener);
}
}); Console.WriteLine("点击任意键,退出WebServer");
Console.ReadLine();
} static async void StartConnectionListener(HttpListener listener)
{
// 等待连接。
HttpListenerContext context = await listener.GetContextAsync(); //释放信号器,另外一个监听器可以立刻开启
sem.Release(); //获得请求对象
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
// 在URL路径上截取文件名称, 介于 "/" 和 "?"之间
string path = request.RawUrl.LeftOf("?").RightOf("/");
Console.WriteLine(path);
//输出一些内容
try
{
// 加载文件并以UTF-8的编码返回
string text = File.ReadAllText(path);
byte[] data = Encoding.UTF8.GetBytes(text);
response.ContentType = "text/html";
response.ContentLength64 = data.Length;
response.OutputStream.Write(data, , data.Length);
response.ContentEncoding = Encoding.UTF8; response.StatusCode = ; response.OutputStream.Close();
}
catch (Exception ex) { Console.WriteLine(ex.Message); } }
}
}

上面的代码初始化了20个监听器。 采用信号器(Semaphore),当一个请求收到后,释放一个信号器,一个新的监听器再次被创建。这个服务器可以同时接收20个请求。使用await机制来处理线程是否继续运行。如果你不熟悉Task、async/await的使用,建议参考一些文档。

创建一个HTML文件,并把属性{复制到输入目录}设置为 “如果较新则复制”

 index.html

<html>
<head>
<title>Simple WebServer</title>
</head>
<body>
<p>Hello World</p>
</body>
</html>

整个目录结构

运行控制台程序,在浏览器中输入地址:

http://localhost/index.html

  

如果浏览器无法访问localhost,编辑C:\Windows\System32\drivers\etc\hosts文件,保证有一条这样的记录

127.0.0.1 localhost

代码下载

编写一个简单的Web Server的更多相关文章

  1. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

  2. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  3. 如何写一个简单的Web Server(一)

      在本篇博文中我将介绍如何写一个Web Server.博文中大部分资料我是参考的这篇文章(http://www.linuxhowtos.org/C_C++/socket.htm),英文不错的同学可以 ...

  4. Python学习 - 编写一个简单的web框架(二)

    在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想. 一个bottle.py的简单实例 来看看bot ...

  5. Python学习 - 编写一个简单的web框架(一)

    自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...

  6. 使用 IDEA 创建 Maven Web 项目 (三)- 编写一个简单的 WEB 应用

    编写 Servlet 类 首先,需要在 java 目录下,创建一个名为 org.smart4j.chapter1 的包.然后,在该包下创建一个 HelloServlet  的类,代码如下: packa ...

  7. 使用Python创建一个简易的Web Server

    Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...

  8. 编写自己的一个简单的web容器(一)

    在之前的博客中我更大家说过Http协议是对tcp协议的封装,其底层还是使用tcp协议来进行数据传出的,浏览器实际上就是一个Socket客户端,今天呢我们就开始着手利用ServerSocket来编写一个 ...

  9. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...

随机推荐

  1. Android Gradle manifestPlaceholders 占位符详解

    Android Gradle manifestPlaceholders 占位符详解 在实际项目中,AndroidManifest里十几个地方的值是需要动态的改变(生成apk文件的时候).如果每次去改也 ...

  2. Memcached安装使用教程及常见问题

    一.Windows下安装memcahed 1.下载memcache的windows稳定版,解压放某个盘下面,比如在c:/memcached2.在终端(也即cmd命令界面)下输入"c:/mem ...

  3. placeholder各种浏览器兼容问题

    只要在页面上引入placeholder.min文件,再以$('input,textarea').placeholder(); 就可以兼容ie等各种浏览器. placeholder.min.js文件链接 ...

  4. 微软的STRIDE模型

    微软的STRIDE模型: https://msdn.microsoft.com/en-us/library/ee823878(v=cs.20).aspx Spoofing identity. An e ...

  5. DirectFB 之 分段动画

    动画动态配置 一套素材的目录结构一般如下: 子目录中的图片名称都是以数字命名,比如,1,2, 3, 4,--        而配置文件animation.cfg的格式如下: #width height ...

  6. ajax从新浪获取实时股票数据

    最近在给公司做一个报表展示,然后领导要求上面加上一些股票的实时数据展示. 一开始同事给我一个聚合数据的网址,说从这上面可以获取到.我一看,哟呵,API接口什么的都提供好了,确实方便.然后想用的时候才发 ...

  7. JS基础——循环很重要

    介绍循环之前,首先要说一下同样很重要的if-else结构,switch-case结构 ①if-else结构 if(判断条件) { 条件为true时执行 } else{ 条件为false时执行 } ②i ...

  8. single number i && ii && iii

    Problem statement Elementary knowledge: There is a popular question when I seeked my job at Beijing: ...

  9. 文本主题模型之LDA(二) LDA求解之Gibbs采样算法

    文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 本文是LDA主题模型的第二篇, ...

  10. Homebrew安装和使用

    ## homebrew使用1. 安装 `$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/m ...