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

2019-12-30 18:15:43刘景俊

前言

最近在学习网络原理,突然萌发出自己实现一个网络服务器的想法,并且由于第三代小白机器人的开发需要,我把之前使用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架构系统中所处的重要位置:

C#,Web,Server

如上图,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://www.easck.com//开始异步接收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);
    }
  }
}