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

在浏览器端,如果用汉语请求的是一普通的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. Entity Framework学习 - 4.Code First升级数据库

    1.在nuget控制台中执行:Enable-Migrations 2.将出现的configuation.cs文件中的AutomaticMigrationsEnabled属性改为true 3.在nuge ...

  2. Win7 系统引导盘(C盘)空间越来越小怎么办?

    Win7的系统引导盘用着用着会越来越小.怎么办呢?我以前在网上查过资料,说是找个工具加大C盘.我加了,从原来的20G加到现在的35G.用了一段时间后,空间又只剩几百M了.难道又要加?? 后来,在网上找 ...

  3. 如何在ubuntu下安装合适的翻译词典

    http://jingyan.baidu.com/article/9faa7231523dd6473c28cb3f.html

  4. [转]SQL语句优化技术分析

    一.操作符优化 1.IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用 ...

  5. Android HTTPS(2)HttpURLConnection.getInputStream异常的原因及解决方案

    Common Problems Verifying Server Certificates InputStream in = urlConnection.getInputStream(); getIn ...

  6. 谈谈Perforce

    实习就要结束了,收获之一就是学会了使用Perforce! Perforce SCM System是一款构建于可伸缩客户/服务器结构之上的软件配置管理工具.仅仅应用 TCP/IP,开发人员就能够通过多种 ...

  7. 我的ipad应用备份

    听歌: 网易云音乐,QQ音乐 摄影: CameraConnect,Replay,PhotoBooth,PhotoCollage,画中画相机,Creative Shape, 简拼,玩图,PicsArt, ...

  8. 简单理解Hibernate三种状态的概念及互相转化

    本文描述了Hibernate三种状态的概念及互相转化.Java对象的生命周期中有三种状态,而且互相转化.它们分别是临时状态,持久化状态,以及游离状态. AD:WOT2015 互联网运维与开发者大会 热 ...

  9. BZOJ 3083 - 遥远的国度

    原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3083 说话间又一个多月过去了..该来除除草了,每天都是训练.没效率,训练.没效率..省选考 ...

  10. jQuery 停止动画、jQuery Callback 函数、jQuery - Chaining

    一.jQuery 停止动画 jQuery stop() 方法用于在动画或效果完成前对它们进行停止. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. $(sele ...