为了更加透彻理解 IIS 服务器原理,自己简单模拟了IIS服务器工作原理,事实证明确实有助于理解!

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 小型IIS服务器
{
    using System.Net.Sockets;
    using System.Net;

/// <summary>
    /// 负责网站socket的监听
    /// </summary>
    public class IISWebServer
    {
        #region 1.0 定义变量
        //定义服务器端监听socket
        Socket serverSocket;
        //服务器IP地址
        string ip;
        //服务器端口号
        int port;
        //定义action泛型委托 传递一个方法进来 为txtRequestStr赋值 将客户端请求报文 显示出来
        Action<string> displayMsg;
        //是否继续循环 用于监听和响应
        bool isStop = false;

#endregion

#region 2.0 构造函数实例化 ip port 传进方法 给txtRequestStr赋值
        /// <summary>
        /// 无参构造方法
        /// </summary>
        public IISWebServer() { }

/// <summary>
        /// 有参构造方法
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <param name="displayMsg"></param>
        public IISWebServer(string ip, int port, Action<string> displayMsg)
        {
            this.ip = ip;
            this.port = port;
            this.displayMsg = displayMsg;
        }
        #endregion

#region 3.0 启动IIS服务器的方法 入口 在Form1 btnStart_Click 方法中被调用

/// <summary>
        /// 启动IIS服务器
        /// </summary>
        public void Start()
        {
            //01 实例化一个流式套接口
            //使用IP4 IP地址 Stream流式套接口 TCP协议
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//02 给套接口绑定ip port
            //IPEndPoint 将网络端点表示为 ip地址 和 端口号
            //IPAddress 提供网际协议(IP)地址
            //IPAddress.Parse(string ip) 让IP地址字符串转换为system.Net.IPAddress实例
            //IPEndPoint(IPAddress.Parse(ip),port) 用指定的IP port 初始化system.Net.IPEndPoint的新实例
            IPEndPoint ipp = new IPEndPoint(IPAddress.Parse(ip), port);
            serverSocket.Bind(ipp);

//03 打开监听
            serverSocket.Listen(20);

//04 开启线程等待浏览器的请求 由于AcceptCilent()会阻断主线程 所以开启子线程来接收客户端链接
            System.Threading.Thread th = new System.Threading.Thread(AcceptCilent);
            th.IsBackground = true;     //该线程是否为后台线程
            th.Start();
        }

#endregion

#region 4.0 等待浏览器向服务器请求
        /// <summary>
        /// 等待浏览器向服务器请求
        /// </summary>
        private void AcceptCilent()
        {
            while (!isStop)
            {
                try
                {
                    //开启服务器之后 代码执行到这就会停止 等待用户连接 一旦连接 就继续往下执行
                    //01 浏览器已发出请求 就会触发Accept()方法
                    Socket cSocket = serverSocket.Accept();

//02 监听到浏览器发出请求后 定义一个子线程 用来接收请求报文 
                    //子线程 因为ReceiveCilent()方法会阻断主线程 所以开辟子线程实现接收用户请求报文
                    //当前线程只负责与当前浏览器通信   
                    //System.Threading.ParameterizedThreadStart(ReceiveCilent) ReceiveCilent在线程上执行的方法
                    System.Threading.Thread thReceive = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ReceiveCilent));
                    thReceive.IsBackground = true;
                    //开启线程时将当前的cSocket传给ReceiveCilent  因为每个线程的cSocket不一样
                    thReceive.Start(cSocket);
                }
                catch { }                
            }
        }

#endregion

#region 5.0 接收浏览器的请求报文  在第4.0步被调用
        /// <summary>
        /// 接收浏览器的请求报文
        /// </summary>
        private void ReceiveCilent(object cSocket)
        {
            //因为每次浏览器向服务器请求时 cSocket不同,所以要转换为Socket型
            //当前线程只负责和当前浏览器通信 每个线程都会传一个cSocket进来 每个线程的cSocket不一样 所以tmpSocket所存储的变量不同 
            //所以在这里要转型
            Socket tmpSocket = cSocket as Socket;
            //申请1M的空间来存储请求报文信息
            byte[] receiveBuffer = new byte[1024 * 1024];
            string requestString = string.Empty;
            while (!isStop)
            {
                try
                {
                    //代码执行到这也会停止 等待用户的请求报文 
                    int len = tmpSocket.Receive(receiveBuffer);
                    //接收浏览器请求报文数据
                    //1.0 将请求报文数据转换为字符串赋值给requestString
                    requestString = System.Text.Encoding.UTF8.GetString(receiveBuffer, 0, len);
                    //tmpSocket.Receive(receiveBuffer);

//2.0 将浏览器请求报文在txtReceiveStr中显示
                    displayMsg(requestString);

//3.0 将请求报文送往ASP.NET框架处理机制
                    byte[] responseByte = IsApiRuntime.ProcessRequest(requestString);

//4.0 通过浏览器的连接套接字tmpSocket 的Send方法将响应报文数据反馈给浏览器
                    tmpSocket.Send(responseByte);
                }
                catch
                {

}
            }

}
        #endregion
    }
}

C#模拟IIS服务器(一)相关推荐

  1. 自建DNS服务器和IIS服务器,模拟访问学校官网

    搭建Web和Ftp服务器 (PS:记录一次Window平台下自建服务器的实验,仅记录) 关键词:域名和DNS解析,IIS服务器搭建Web服务器和FTP服务器(FTP待补充) 文章导读 简要理论复习 1 ...

  2. 本地Windows 7/8上搭建IIS服务器

    1.打开"控制面板",选择"程序和功能"(查看方式小图标), 2.进入界面后,点击"启动或关闭Windows功能". 然后勾选图中的两个选框 ...

  3. 使IIS服务器支持下载 apk/ipa 安装包

    默认情况下,使用IIS作为Web服务器的无法下载此文件,访问会触发404错误,服务器找不到对应资源. IIS服务器不能下载.apk文件的原因:iis的默认MIME类型中没有.apk文件,所以无法下载. ...

  4. tomcat与IIS服务器集成

    22.4 Tomcat与IIS服务器集成 IIS(Internet Information Service)服务器是微软开发的功能强大的Web服务器,IIS为创建和开发电子商务的提供了安全的Web平台 ...

  5. 电脑服务器怎么打开网页,电脑的iis服务器打开网页的方法

    如果想要让自己电脑上的网页在局域网中可以访问到,就需要我们使用IIS服务器,将网页添加到服务器上的网站,设置服务器的方法并不难.下面是学习啦小编为大家整理的关于电脑的iis服务器打开网页的方法,一起来 ...

  6. 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    转载:https://www.cnblogs.com/xiongze520/p/10308720.html 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟 ...

  7. win7计算机不支持此接口,win7系统IIS服务器启动失败显示不支持此接口的解决方法...

    很多小伙伴都遇到过 出错表现为以下几点: 1.World Wide Web Publishing 服务在请求配置数据库更改通知时遇到问题.数据域包含错误号. 2.初始化 World Wide Web ...

  8. IIS服务器下做301永久重定向设置方法[图解]

    以前也没怎么关注301重定向,第一因为没有网站要重定向,第二对于不带www的域名我都是用的转发到带www的域名. 不过一场风波之后,很多服务商已经不提供转发服务了,虽说易名现在还可以享用到免费的转发服 ...

  9. HTTP 错误 403.9 - 禁止访问:连接的用户过多 XP IIS服务器连接数的修改

    计算机教室的机子是XP的,用IIS很不爽,学生机连接到教师机下载资料或上交作业时常常遇到连接的用户过多的错误提示(HTTP 错误 403.9 - 禁止访问:连接的用户过多),这是因为Windows X ...

  10. 生成pfx文件需要在服务器上执行,PEM文件和private.key文件生成IIS服务器所需的pfx文件(配置SSL用)...

    第一步:输入域名,点击"创建免费的SSL证书"按钮,如图 第二步:输入邮箱,点击创建,如图 创建成功后,需要进行dns验证,结果图如下: 第三步:在域名所在的云服务器上,添加域名解 ...

最新文章

  1. 员工提出离职,称害怕猝死,HR却说:先猝死了再说!
  2. panel内嵌程序窗体
  3. 【图像处理】——比特平面原理和实现方法(全网较全面,含所有比特位图的分层方法)
  4. 《看聊天记录都学不会C语言?太菜了吧》(12)循环有多容易?你看一眼就怀...
  5. 网络数据隐私保护,阿里工程师怎么做?
  6. java获取url的参数page返回数值page计算_Java常用代码汇总,建议背会
  7. 你需要了解的HashMap、HashTable和ConcurrentHashMap的区别
  8. Quartz 触发器、过期触发策略 、排它日历、数据持久化
  9. CSAcademy Beta Round #5 Long Journey
  10. 设某一机器由n个部件组成_干货 | 带你了解!工业机器人知识大全
  11. 在深度学习时代如何用 HowNet 搞事情 | 讲座笔记
  12. mysql sid是什么_数据库名、数据库实例、全局数据库名、服务名、SID等的区别
  13. 超级计算机 弦理论,暗能量导致宇宙加速膨胀?弦理论能否帮忙解决?
  14. 目标跟踪系列三:ECO: Efficient Convolution Operators for Tracking(2016年11月)
  15. 安卓手机查看充放电电压、电流及功率
  16. R语言入门基础——基础操作篇(极为基础的指令代码)
  17. GE 开放操作系统 Predix,有望成工业互联网事实标准
  18. 第三方支付创新与风控是未来关键——拉卡拉支付
  19. 机器学习面试总结(一)
  20. 简说Pinterest

热门文章

  1. UINO优锘:产品实施“八步法”让客户感受DCV实施的专业性
  2. html给图片添加边框
  3. 诺瓦科技2022数字IC设计提前批笔试
  4. 052RINEX中N文件示例说明
  5. DSP 基础学习 1:搭建环境与CCS6创建工程模板
  6. SIGCOMM2019几篇有意思的文章
  7. 对与连连看求解算法的研究
  8. 苏州大学NLP团队文本生成预训练方向招收研究生/博士生(含直博生)
  9. dna计算机 论文,科学网—阿德勒曼DNA计算机(科普) - 沈海军的博文
  10. 局域网连接外网时,二级路由器设置