数往知来 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();
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 模拟服务器:服务端_静态页面_动态页面的响应<十七>的更多相关文章
- Asp.net SignalR 实现服务端消息实时推送到所有Web端
ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.实际上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加 ...
- 用php模拟做服务端侦听端口
参考:http://www.cnblogs.com/thinksasa/archive/2013/02/26/2934206.html http://blog.csdn.net/alongken200 ...
- Asp.net SignalR 实现服务端消息推送到Web端
之前的文章介绍过Asp.net SignalR, ASP .NET SignalR是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信. 今天我 ...
- asp.net core webapi 服务端配置跨域
在前后端分离开发中服务端仅仅只为前端提供api接口,并且前后端往往单独部署,此时就会出现浏览器跨域问题.asp.net core提供了简单优雅的解决方案. 在startup文件的Configure添加 ...
- php的异步非阻塞swoole模块使用(一)实现简易tcp服务器--服务端
绑定tcp服务器的地址 $swserver = new swoole_server("127.0.0.1",9501); 设置tcp服务器装机容量(太危言耸听了-其实就是设置属性) ...
- ASP.NET MVC在服务端把异步上传的图片裁剪成不同尺寸分别保存,并设置上传目录的尺寸限制
我曾经试过使用JSAjaxFileUploader插件来把文件.照片以异步的方式上传,就像"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01- ...
- asp.net mvc后台操作之读写xml控制首页动态页面开关显示
一.背景 在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面.因此不仅需要在活动代码中加入限制 ...
- [备忘]Asp.net MVC 将服务端Model传递的对象转为客户端javascript对象
<script type="text/javascript"> var jsObject = @Html.Raw(Json.Encode(Model.Objects)) ...
- [原]Nginx+Lua服务端合并静态文件
http://homeway.me 0x01.About 源代码已经上传到github:https://github.com/grasses/nginx-lua-static-merger nginx ...
随机推荐
- JSP的执行过程及其异常处理机制
1.JSP的执行过程 虽然JSP感觉上很像一般的HTML网页,但事实上它是以Servlet的形式被运行的.因为JSP文件在第一次运行的时候会先解释成Servlet源文件,然后编译成Servle ...
- 深入理解Java内存模型(五)——锁
锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步机制.锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息. 下面是锁释放-获取的示例代 ...
- Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...
- Newtonsoft.Json序列化和反序列之javascriptConvert.SerializeObject,DeserializeObject,JsonWriter,JsonReader
这里下载:http://www.newtonsoft.com/products/json/安装: 1.解压下载文件,得到Newtonsoft.Json.dll 2.在项目中添加引用.. jav ...
- 反编译android APK
我们经常会在如下的情况使用反编译 1.看到别人应用中的酷炫功能,想知道是如何实现的 2.别人应用的素材排版好漂亮,想套用模仿 百度一下就已经有一大堆反编译的教程了,我还是坚持学习记录一下. A ...
- HDU 1907 (博弈) John
参见上一篇博客,里面有分析和结论. #include <cstdio> int main() { int T; scanf("%d", &T); while(T ...
- LA 3902 Network
人生第一道图论题啊,有木有 题意: 有一个树状网络,有一个原始服务器s,它的服务范围是k 问至少再放多少台服务范围是k的服务器才能使网络中的每个节点都被覆盖掉 解法: 我们以原始服务器为根将其转化成一 ...
- 07_js走路小游戏
<html> <head> <!-- 不做了,思路: 按enter键停止,将xs,ys替换为0,再次按,判断xs和ys是否为0,是的话,讲根据fx给xsys赋值. 实现鼠 ...
- phpcms v9 搬家
1.修改/caches/configs/system.php里面所有和域名有关的,把以前的老域名修改为新域名. 2.进入后台设置--站点管理,对相应的站点的域名修改为新域名. 3.点击后台右上角的更新 ...
- (六)6.13 Neurons Networks Implements of stack autoencoder
对于加深网络层数带来的问题,(gradient diffuse 局部最优等)可以使用逐层预训练(pre-training)的方法来避免 Stack-Autoencoder是一种逐层贪婪(Greedy ...