设为首页 加入收藏

TOP

自己动手实现网络服务器(Web Server)——基于C#(一)
2017-10-16 18:19:48 】 浏览:8605
Tags:自己 动手 实现 网络 服务器 Web Server 基于

  

前言

最近在学习网络原理,突然萌发出自己实现一个网络服务器的想法,并且由于第三代小白机器人的开发需要,我把之前使用python、PHP写的那部分代码都迁移到了C#(别问我为什么这么喜欢C#),之前使用PHP就是用来处理网络请求的,现在迁移到C#了,而Linux系统上并没有IIS服务器,自然不能使用ASP.Net,所以这个时候自己实现一个功能简单的网络服务器就恰到好处地解决这些问题了。

基本原理

Web Server在一个B/S架构系统中起到的作用不仅多而且相当重要,Web开发者大部分时候并不需要了解它的详细工作机制。虽然不同的Web Server可能功能并不完全一样,但是以下三个功能几乎是所有Web Server必须具备的:

  • 接收来自浏览器端的HTTP请求
  • 将请求转发给指定Web站点程序(后者由Web开发者编写,负责处理请求)
  • 向浏览器发送请求处理结果

下图显示Web Server在整个Web架构系统中所处的重要位置:

如上图,Web Server起到了一个“承上启下”的作用(虽然并没有“上下”之分),它负责连接用户和Web站点。

每个网站就像一个个“插件”,只要网站开发过程中遵循了Web Server提出的规则,那么该网站就可以“插”在Web Server上,我们便可以通过浏览器访问网站。

太长不看版原理

浏览器想要拿到哪个文件(html、css、js、image)就和服务器发请求信息说我要这个文件,然后服务器检查请求合不合法,如果合法就把文件数据传回给浏览器,这样浏览器就可以把网站显示出来了。(一个网站一般会包含n多个文件)

话不多说,直接上代码

在C#中有两种方法可以简单实现Web服务器,分别是直接使用Socket和使用封装好的HttpListener。

因为后者比较方便一些,所以我选择使用后者。

这是最简单的实现一个网络服务器,可以处理浏览器发过来的请求,然后将指定的字符串内容返回。

class Program { static void Main(string[] args) { string port = "8080"; HttpListener httpListener = new HttpListener(); httpListener.Prefixes.Add(string.Format("http://+:{0}/", port)); httpListener.Start(); httpListener.BeginGetContext(new AsyncCallback(GetContext), httpListener); //开始异步接收request请求 Console.WriteLine("监听端口:" + port); Console.Read(); } static void GetContext(IAsyncResult ar) { HttpListener httpListener = ar.AsyncState as HttpListener; HttpListenerContext context = httpListener.EndGetContext(ar); //接收到的请求context(一个环境封装体) httpListener.BeginGetContext(new AsyncCallback(GetContext), httpListener); //开始 第二次 异步接收request请求 HttpListenerRequest request = context.Request; //接收的request数据 HttpListenerResponse response = context.Response; //用来向客户端发送回复 response.ContentType = "html"; response.ContentEncoding = Encoding.UTF8; using (Stream output = response.OutputStream) //发送回复 { byte[] buffer = Encoding.UTF8.GetBytes("要返回的内容"); output.Write(buffer, 0, buffer.Length); } } } 

这个简单的代码已经可以实现用于小白机器人的网络请求处理了,因为大致只用到GET和POST两种HTTP方法,只需要在GetContext方法里判断GET、POST方法,然后分别给出响应就可以了。

但是我们的目的是开发一个真正的网络服务器,当然不能只满足于这样一个专用的服务器,我们要的是可以提供网页服务的服务器。

那就继续吧。

根据我的研究,提供网页访问服务的服务器做起来确实有一点麻烦,因为需要处理的东西很多。需要根据浏览器请求的不同文件给出不同响应,处理Cookies,还要处理编码,还有各种出错的处理。

首先我们要确定一下我们的服务器要提供哪些文件的访问服务。

这里我用一个字典结构来保存。

/// <summary> /// MIME类型 /// </summary> public Dictionary<string, string> MIME_Type = new Dictionary<string, string>() { { "htm", "text/html" }, { "html", "text/html" }, { "php", "text/html" }, { "xml", "text/xml" }, { "json", "application/json" }, { "txt", "text/plain" }, { "js", "application/x-java script" }, { "css", "text/css" }, { "bmp", "image/bmp" }, { "ico", "image/ico" }, { "png", "image/png" }, { "gif", "image/gif" }, { "jpg", "image/jpeg" }, { "jpeg", "image/jpeg" }, { "webp", "image/webp" }, { "zip", "application/zip"}, { "*", "*/*" } }; 

剧透一下:其中有PHP类型是我们后面要使用CGI接入的方式使我们的服务器支持PHP。

我在QFramework中封装了一个QHttpWebServer模块,这是其中的启动代码。

/// <summar
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇asp.net mvc CodeFirst模式数据库.. 下一篇.NET core RSA帮助类

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目