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

 

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

在浏览器端,如果用汉语请求的是一普通的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(10);

            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()

       {

           byte[] buffer=new byte[1024*1024*2];

           int receLength=newSocket.Receive(buffer);

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

           string msg = System.Text.Encoding.UTF8.GetString(buffer,0,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",替换成一个生僻词(字符),在根据该字符进行分割.

           string[]firstRow=arrayString[0].Split(‘ ‘);//取出第一行,在根据空格进行分割.

           path=firstRow[1].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, 0, buffer.Length);//直接将HTML代码(静态文件代码)读到buffer数组中.

               //构建响应报文。

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

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

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

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

newSocket.Send(responseModel.GetHeaderResponse());

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

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

               newSocket.Send(buffer);

           }
时间: 2025-01-28 19:03:06

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

python 模拟HTTP服务端

使用python模拟http服务端,自定义返回信息头部: #!/usr/bin/python import os from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer Host = '' Port = 8080 class RequestHandler(BaseHTTPRequestHandler):         def do_GET(self):                 Time = os.popen('date 

服务端控制各种浏览器禁止缓存页面资源 学习笔记

import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Demo2 extends HttpServlet { public voi

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

原文:http://www.cnblogs.com/wintersun/p/4148223.html 之前的文章介绍过Asp.net SignalR,  ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.  今天我们来实现服务端消息推送到Web端,   首先回顾一下它抽象层次图是这样的: 实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加简单. 为了获取更好的可伸缩性, 我们引入消息队列, 看如下

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

参考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html http://blog.csdn.net/alongken2005/article/details/8056910 socket_accept()是服务端接受客户端请求,一旦有一个客户端链接上来的话,则这个函数会返回一个新的socket资源,这个资源是与客户端通信的资源. socket_accept()是阻塞的,会一直卡在那里. 发现情况:一旦客户端断开链接了,

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

我曾经试过使用JSAjaxFileUploader插件来把文件.照片以异步的方式上传,就像"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01-单文件上传"中说的,这种方法足够轻.足够好.但今天,要在前面的基础上再增加2个需求: 1.异步判断上传的图片是否超过最大限制2.把上传的图片裁剪成大中小3张图片,分别保存,删除的时候一块被删除 上传图片如果超出最大尺寸限制,终止上传,并报错误信息. 前台上传图片,显示缩略图. 在项目根目录下的指定文

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

一.背景 在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面.因此不仅需要在活动代码中加入限制功能,也需要在前台取消不合时宜的页面的展示.后台效果图: 二.问题分析 要想控制页面开关显示,就得有存储开关信息的介质,将在后台产生的操作记录下来,并在浏览者加载首页之时能读取操作记录并达到控制页面开关的目的.因此,考虑两种介质储存开关记录信息,一是用数据库mysql,二是用xml.考虑到这对数据库

Asp.Net服务端的基本控件

今天开始把最基础的Asp.Net服务端基本控件学习巩固了一下 1.Asp.Net服务端控件是Asp.Net对HTML的封装,在C#代码中就可以用txt1.Text="指定值"这种方式修改 input的值,Asp.Net会将服务端控件渲染成HTML代码输出给浏览器,服务端控件是Asp.Net非常容易上手,也非常吸引初学者,但也是被人诟病的东西.因为它会传输很多无法的东西,如viewstate. 服务端控件在内网或互联网系统的后台部分等访问频率不高的地方还是很适合的. 服务端控件只能用po

ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因为WCF中不仅仅只是有SOAP, 它还包含很多如消息安全性,生成WSDL,双工信道,非HTTP传输等. ASP.NET Core 官方推荐大家使用RESTful Web API的解决方案提供网络服务. SOAP 即 Simple Object AccessProtocol 也就是简单对象访问协议.

1.使用SignalR实现页面即时刷新(服务端主动推送)

模块功能说明: 实现技术:sqlserver,MVC,WebAPI,ADO.NET,SignalR(服务器主动推送) 特殊车辆管理--->移动客户端采集数据存入数据库---->只要数据库数据有变化,服务端自动推送到Wbe页面展示(区别于传统的web请求)-->审核人员审核数据-->返回审核结果给移动客户端 在开发之前搜索了大量文档,也在QQ群咨询过群里的大牛,不少人都感觉比较懵逼的样子.有人建议使用ajax中的长连接,轮询等技术,最终还是决定使用SignalR技术实现页面刷新的效果