基于c#动手实现网络服务器Web服务器

  

<强>前言
  

  

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

  

<>强基本原理
  

  

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

  

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

  

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

  

基于c#动手实现网络服务器Web服务器

  

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

  

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

  

<强>太长不看版原理
  

  

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

  

<强>话不多说,直接上代码
  

  

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

  

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

  

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

  

        类项目   {   静态void Main (string [] args)   {   字符串端口=" 8080 ";   HttpListener HttpListener=new HttpListener ();   httpListener.Prefixes.Add(字符串。格式(“http://+:{0}/端口));   httpListener.Start ();   httpListener。BeginGetContext(新AsyncCallback (GetContext)、httpListener);//开始异步接收请求请求   控制台。WriteLine(“监听端口:“+端口);   Console.Read ();   }      静态孔隙GetContext (IAsyncResult ar)   {   HttpListener HttpListener=ar.AsyncState HttpListener;   HttpListenerContext上下文=httpListener.EndGetContext (ar);//接收到的请求上下文(一个环境封装体)      httpListener。BeginGetContext(新AsyncCallback (GetContext)、httpListener);//开始第二次异步接收请求请求      HttpListenerRequest请求=context.Request;//接收的请求数据   HttpListenerResponse响应=context.Response;//用来向客户端发送回复      响应。ContentType=癶tml”;   响应。ContentEncoding=Encoding.UTF8;      使用(流输出=response.OutputStream)//发送回复   {   缓冲=Encoding.UTF8.GetBytes byte[](“要返回的内容”);   输出。写(缓冲区,0,buffer.Length);   }   }   }      之前      

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

  

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

  

那就继续吧。

  

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

  

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

  

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

     ///& lt; summary>///MIME类型///& lt;/summary>   公共Dictionary<字符串,string>MIME_Type=new Dictionary<字符串,string> ()   {   {“htm”、“text/html”},   {“html”、“text/html”},   {“php”,“text/html”},   {“xml”,“text/xml”},   {" json”、“application/json "},   {“三种”、“文本/普通”},   {" js ", "应用程序/x-javascript "},   {“css”、“文本/css "},   {“bmp”、“图像/bmp "},   {“图标”、“图像/图标"},   {“png”、“图像/png”},   {“gif”、“图像/gif”},   {“jpg”、“图像/jpeg”},   {“jpeg”、“图像/jpeg "},   {“webp”、“图像/webp "},   {“邮政编码”,“应用程序/zip "},   {“*”、“*/*”}   };   

基于c#动手实现网络服务器Web服务器