编写一个简单的Web Server
编写一个简单的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的更多相关文章
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- 如何写一个简单的Web Server(一)
在本篇博文中我将介绍如何写一个Web Server.博文中大部分资料我是参考的这篇文章(http://www.linuxhowtos.org/C_C++/socket.htm),英文不错的同学可以 ...
- Python学习 - 编写一个简单的web框架(二)
在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想. 一个bottle.py的简单实例 来看看bot ...
- Python学习 - 编写一个简单的web框架(一)
自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...
- 使用 IDEA 创建 Maven Web 项目 (三)- 编写一个简单的 WEB 应用
编写 Servlet 类 首先,需要在 java 目录下,创建一个名为 org.smart4j.chapter1 的包.然后,在该包下创建一个 HelloServlet 的类,代码如下: packa ...
- 使用Python创建一个简易的Web Server
Python 2.x中自带了SimpleHTTPServer模块,到Python3.x中,该模块被合并到了http.server模块中.使用该模块,可以快速创建一个简易的Web服务器. 我们在C:\U ...
- 编写自己的一个简单的web容器(一)
在之前的博客中我更大家说过Http协议是对tcp协议的封装,其底层还是使用tcp协议来进行数据传出的,浏览器实际上就是一个Socket客户端,今天呢我们就开始着手利用ServerSocket来编写一个 ...
- 使用Servlet和JSP实现一个简单的Web聊天室系统
1 问题描述 利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...
随机推荐
- android奋战的一周
移动开发项目终于开始了,我也开始紧张起来了,就靠着培训时候学的一知半解的知识,作为一个主力不得不逼着自己不停的做实验,不停的学习. 有辛苦就有回报,我也对android开发中整体的框架有了些许的了解. ...
- SpringMVC中使用bean来接收form表单提交的参数时的注意点
这是前辈们对于SpringMVC接收表单数据记录下来的总结经验: SpringMVC接收页面表单参数 springmvc请求参数获取的几种方法 下面是我自己在使用时发现的,前辈们没有记录的细节和注意点 ...
- Kafka 源码剖析
1.概述 在对Kafka使用层面掌握后,进一步提升分析其源码是极有必要的.纵观Kafka源码工程结构,不算太复杂,代码量也不算大.分析研究其实现细节难度不算太大.今天笔者给大家分析的是其核心处理模块, ...
- C# Webclient 和 Httpclient如何通过iis authentication 身份验证。
前言: 该博客产生的背景是客户那边有部署网站的方法是iis windows authentication身份验证,而系统中使用Webclient来调用别的系统的方法.在此情况下,原本可以使用的功能,都 ...
- js 正则表达式验证
验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9 ...
- [刷题]算法竞赛入门经典(第2版) 6-9/UVa127 - "Accordian" Patience
题意:52张牌排一行,一旦出现任何一张牌与它左边的第一张或第三张"匹配",即花色或点数相同,则须立即将其移动到那张牌上面,将其覆盖.能执行以上移动的只有压在最上面的牌.直到最后没有 ...
- Centos6.5_x86上Oracle11g2 32位的安装与卸载以及相关问题汇总
需要注意的问题: 1.Linux包括内核和要安装的oralce版本是否符合(这个在官方文档中有说明). 2.安装oracle一般会新建一个为oracle的账户,注意在安装的过程中的root和oracl ...
- 关于java中的==,equals()
1. 先从一道面试题说起 请问下面的 public class Demo { public static void main(String args[]){ String a = "a&qu ...
- Android 应用内多语言切换
最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果用户在 App 内进行了语言设置,那么就使用用户设置的语言.当然,你会发现,App 的 ...
- 前端架构之路:使用Vue.js开始第一个项目
Vue.js做为目前前端最热门的库之一,为快速构建并开发前端项目多了一种思维模式.本文通过一个简单的实例开始上手Vue.js开发. 一.技术准备 笔者建议在开始项目前,对以下两个技术点进行了解. ...