一、客户端是怎么看到我们的网页的呢/

在浏览器端,如果用汉语请求的是一普通的HTML网页,呢么我们的IIS服务器,

接收到请求以后,那么从IIS服务器所在的电脑区查找该HTML网页,

找到以后将该HTML网页返回给我们的浏览器

如果客户端请求的是动态的网页(aspx/jsp等)我们的IIS处理不了,

它会找到映射表里找到这个文件所在的路径在这个文件夹下找到的对应的DLL文件,

然后把这个dll交给.net framawork来执行,

.net framawork会把执行之后产生的html代码返回给IIS服务器,

服务器再把这些HTML代码返回给浏览器

1:自己服务器_获取请求报文(委托的应用)

//主窗体中的代码

/// <summary>

        /// 开始服务器监听。

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        Socket ListenSocket = null;

        private void btn_Start_Click(object sender, EventArgs e)

        {

            ListenSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

            IPAddress ipaddress = IPAddress.Parse(this.txtIP.Text);

            IPEndPoint endpoint = new IPEndPoint(ipaddress,Convert.ToInt32(this.txtPort.Text));

            ListenSocket.Bind(endpoint);

            ListenSocket.Listen();

            Thread thread = new Thread(ServerConnection);

            thread.IsBackground = true;

            thread.Start();

        }

        public void ServerConnection()

        {

            while (true)

            {

                Socket newSocket = ListenSocket.Accept();//负责与浏览器进行通信的Socket.

                ShowMsg("链接成功"+newSocket.RemoteEndPoint.ToString());

                DataConnection connection = new DataConnection(newSocket, ShowMsg);

//将负责与浏览器交互的套接字传递的该类中,有该类完成对请求报文的接受与处理。

第二个参数,将用来显示请求报文的方法名作为参数传递该类中。

            }

        }

        /// <summary>

        /// 将请求报文追加到文本框中。

        /// </summary>

        /// <param name="msg"></param>

        public void ShowMsg(string msg)

        {

            this.txtContent.AppendText(msg+"\r\n");

        }

///DataConnection类中的代码

/// <summary>

    /// 对请求报文的接受与处理都是在该类中完成。

    /// 1:接收浏览器发送过来的请求报文。

    /// 2:将请求报文显示在文本框中

    /// 3:对请求报文进行分析。

    /// 4:对请求报文进行处理。

    /// 5:构建响应报文

    /// 6:将响应报文返回给浏览器。

    /// </summary>

    public class DataConnection

    {

        Socket newSocket = null;

        DGShowMsg DGShow = null;

        /// <summary>

        /// 第一参数:表示与浏览器进行交互的Socket.

        /// 二:是一个委托,那么将一个方法名赋给了改委托,那么接下来就可以使用该委托去调用该方法。

        /// </summary>

        /// <param name="newSocket"></param>

        /// <param name="DGShow"></param>

        public DataConnection(Socket newSocket, DGShowMsg DGShow)

       {

           this.newSocket = newSocket;//获取到了与客户端交互的套接字.

           this.DGShow = DGShow;

           Thread thread = new Thread(ReceiveMsg);

           thread.IsBackground = true;

           thread.Start();

       }

        /// <summary>

        /// 开始接受请求报文

        /// </summary>

       public void ReceiveMsg()

       {

           **];

           int receLength=newSocket.Receive(buffer);

//接收请求报文填充到buffer数组中,并且获得实际接收数据的长度.

           ,receLength);//转成字符串.

           DGShow(msg);//通过该委托调用了主窗体中的ShowMsg方法。

       }

public delegate void DGShowMsg(string msg);//我们自己定义的委托。

2:分析请求报文

HttpRequestModel类中代码

 /// <summary>

    /// 对请求报文进行分析处理的类

    /// </summary>

   public class HttpRequestModel

    {

       /// <summary>

       /// 将请求传递过来。

       /// </summary>

       /// <param name="msg"></param>

       public HttpRequestModel(string msg)

       {

           string[] arrayString=msg.Replace("\r\n", "罓").Split('罓');

//将"\r\n",替换成一个生僻词(字符),在根据该字符进行分割.

           ].Split(' ');//取出第一行,在根据空格进行分割.

           path=firstRow[].ToString();//获取到了请求报文中所要请求的文件的名称。

       }

       private string path;//请求报文中所要请求的文件.

       public string Path

       {

           get { return path; }

           set { path = value; }

       }

在DataConnection类中的ReceiveMsg方法新添加的代码

 HttpRequestModel requestModel = new HttpRequestModel(msg);

//将请求报文中的内容传递该类中进行处理。

3:对静态文件处理.

/// <summary>

        /// 开始对文件进行处理

        /// </summary>

        /// <param name="requestModel">该对象中包含了请求的文件名称</param>

       public void JustProcessPage(HttpRequestModel requestModel)

       {

           //1:看一下所请求的文件,在服务端是否存在.

           string Datadir = AppDomain.CurrentDomain.BaseDirectory;//获取.exe文件所在的目录.

           if (Datadir.EndsWith(@"\bin\Debug\") || Datadir.EndsWith(@"\bin\Release\"))

           {

               Datadir = System.IO.Directory.GetParent(Datadir).Parent.Parent.FullName;

//获取上一级目录的上一级.

           }

           string fullDir=Datadir + requestModel.Path;//在指定的目录下,去查找请求报文中的文件。

           //2:找到文件以后,判断该文件是静态文件还是动态文件.

           string extions=Path.GetExtension(requestModel.Path);//获取请求报文中所请求的文件的扩展名

           switch (extions)

           {

               case ".html":

               case ".htm":

                   ProcessStatePage(fullDir);//对获取到的静态的HTML文件进行处理。

(完整的所要访问的文件的路径)

                   break;

           }

       }

        /// <summary>

        /// 对静态文件进行处理.

        /// </summary>

        /// <param name="fullDir"></param>

       public void ProcessStatePage(string fullDir)

       {

           //由于是静态文件,所以在这里直接读取。

           byte[] buffer = null;

           using (FileStream fs = new FileStream(fullDir, FileMode.Open))

           {

               buffer=new byte[fs.Length];

               fs.Read(buffer, , buffer.Length);//直接将HTML代码(静态文件代码)读到buffer数组中.

               //构建响应报文。

               //响应体:buffer数组中存储的内容。

               //构建响应头.(调用HttpResponseModel中的方法构建响应头)

HttpResponseModel responseModel = new HttpResponseModel(buffer);//将buffer响应体传递到该类中。

               //将响应包文返回给浏览器

newSocket.Send(responseModel.GetHeaderResponse());

//获取在HttpResponseModel中定义的响应报文头,然后通过sokcet发给浏览器。

               //将响应报文体发送给浏览器

               newSocket.Send(buffer);

           }

数往知来 ASP.NET 模拟服务器:服务端_静态页面_动态页面的响应<十七>的更多相关文章

  1. Asp.net SignalR 实现服务端消息实时推送到所有Web端

    ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加 ...

  2. 用php模拟做服务端侦听端口

    参考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html http://blog.csdn.net/alongken200 ...

  3. Asp.net SignalR 实现服务端消息推送到Web端

              之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我 ...

  4. asp.net core webapi 服务端配置跨域

    在前后端分离开发中服务端仅仅只为前端提供api接口,并且前后端往往单独部署,此时就会出现浏览器跨域问题.asp.net core提供了简单优雅的解决方案. 在startup文件的Configure添加 ...

  5. php的异步非阻塞swoole模块使用(一)实现简易tcp服务器--服务端

    绑定tcp服务器的地址 $swserver = new swoole_server("127.0.0.1",9501); 设置tcp服务器装机容量(太危言耸听了-其实就是设置属性) ...

  6. ASP.NET MVC在服务端把异步上传的图片裁剪成不同尺寸分别保存,并设置上传目录的尺寸限制

    我曾经试过使用JSAjaxFileUploader插件来把文件.照片以异步的方式上传,就像"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01- ...

  7. asp.net mvc后台操作之读写xml控制首页动态页面开关显示

    一.背景 在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面.因此不仅需要在活动代码中加入限制 ...

  8. [备忘]Asp.net MVC 将服务端Model传递的对象转为客户端javascript对象

    <script type="text/javascript"> var jsObject = @Html.Raw(Json.Encode(Model.Objects)) ...

  9. [原]Nginx+Lua服务端合并静态文件

    http://homeway.me 0x01.About 源代码已经上传到github:https://github.com/grasses/nginx-lua-static-merger nginx ...

随机推荐

  1. USACO Section 2.2: Subset Sums

    dp题,一碰到dp我基本就是跪,搜了网上的答案分两种,一维和二维. 先讲二维,sum[i][j]表示前i个数的subset里差值为j的分法数量.当加入数字i时,有两种选择,某一个set和另外一个set ...

  2. MySQL:创建、修改和删除表

    其实对很多人来说对于SQL语句已经忘了很多,或者说是不懂很多,因为有数据库图形操作软件,方便了大家,但是我们不能忘记最根本的东西,特别是一些细节上的东西,可能你用惯了Hibernate,不用写SQL语 ...

  3. leetcode:Intersection of Two Linked Lists(两个链表的交叉点)

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  4. matlab函数集锦

    matlab函数集锦 matlab函数集锦ISFINITE(X), ISINF(X), or ISNAN(X)pwd 当前目录eval 执行matlab函数CONV2(  ,'same')  卷积F  ...

  5. HibernateTools的使用

    1. 到 Hibernate.org官网上 下载最新版的 Hibernate Tools,我用的是 HibernateTools-3.2.4.GA版 2. 将 下载下来的压缩包解压缩,里面会有 plu ...

  6. pl/sql programming 03 语言基础

    PL/SQL 块结构 最小的有意义的代码单元叫做 块(block). 一个块是一组代码, 这个块给出了执行边界, 也为变量声明和异常处理提供了作用范围, pl/sql 准许我们创建匿名块和命名块, 命 ...

  7. WP7应用版本升级的实现方法

    首先必须要有一个服务提供升级推送查询 // Code to execute when the application is launching (eg, from Start)         //  ...

  8. radio checked不起作用的原因

    <table id="approveTable"> <tr> <td> <input type="radio" nam ...

  9. laravel/laravel和laravel/framework有何区别?

    在安装laravel的时候,我们一般是download github上的laravel/laravel,随后执行composer install,在这个过程中,你会发现composer其中的一项工作是 ...

  10. Chrome 快捷键使用

    窗口和标签页快捷方式 Ctrl+N 打开新窗口 按住 Ctrl‎ 键,然后点击链接 在新标签页中打开链接 按住 Shift 键,然后点击链接 在新窗口中打开链接 Alt+F4 关闭当前窗口 Ctrl+ ...