代码改变世界

ASP.NET 本质论 读书笔记(一)

2011-07-17 12:45  深圳肉肉  阅读(416)  评论(2)    收藏  举报

      一个用户(Client)在浏览器上输入一个网址http://www.cnblogs.com/meat,然后我们就可以见到到了一个可爱的页面。这背后发生了什么呢?相信大部分看官都已经知道了。整个流程如下:

       1. 浏览器通过URL找到博客园的Web服务器并把请求信息参数化传递上去

       2. Web服务器接收到来自浏览器的请求后经过一系列的处理会回应一个输出流给浏览器

       3. 浏览器接收并解析Web服务器端返回的数据,如果遇到需要请求图片或者js、css文件的情况下

           会在反复执行1、2、3步骤。

       4. 解析完成。

如图:

如图中Http Reqauest其实不怎么准确,因为有些时候它也会包含Content,这是要看请求是什么类型的,如果是GET就不需要,而POST则会把请求参数放在Content中。

下面将演示自定义一个简单ASP.NET 服务器,其实功能上就是最简化的IIS。通过监听Web服务器上的端口,然后相应浏览器端的请求,最后把服务器端把响应信息传回浏览器端.

 public void Run()
        {
            // 取得本机的 loopback 网络地址,即 127.0.0.1
            IPAddress address = IPAddress.Loopback;
            // 创建可以访问的端点,49152 表示端口号
            IPEndPoint endPoint = new IPEndPoint(address, 49152);
            // 创建一个 socket,使用 IPv4 地址,传输控制协议 TCP,双向、可靠、基于连接的字节流
            Socket socket = new Socket(
                AddressFamily.InterNetwork,
                SocketType.Stream,
                ProtocolType.Tcp);
            // 将 socket 绑定到一个端点上
            socket.Bind(endPoint);
            // 设置连接队列的长度
            socket.Listen(10);
            Console.WriteLine("开始监听, 端口号:{0}.", endPoint.Port);
            while (true)
            {
                // 开始监听,这个方法会阻塞线程的执行,直到接受到一个客户端的连接请求
                Socket client = socket.Accept();
                // 输出客户端的地址
                Console.WriteLine(client.RemoteEndPoint);
                // 准备读取客户端请求的数据,读取的数据将保存在一个数组中
                byte[] buffer = new byte[4096];
                // 接受数据
                int length = client.Receive(buffer, 4096, SocketFlags.None);
                // 将请求的数据翻译为 UTF-8
                System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
                string requestString = utf8.GetString(buffer, 0, length);
                // 显示请求的内容
                Console.WriteLine(requestString);
                // 状态行
                string statusLine = "HTTP/1.1 200 OK\r\n";
                byte[] statusLineBytes = utf8.GetBytes(statusLine);
                // 准备发送到客户端的网页
                string responseBody 
                    = @"<html>
                            <head><title>From Socket Server</title></head>
                            <body><h1>Hello, world.</h1></body>
                        </html>";
                byte[] responseBodyBytes = utf8.GetBytes(responseBody);
                // 回应的头部
                string responseHeader =
                    string.Format(
                        "Content-Type: text/html; charset=UTF-8\r\nContent-Length: {0}\r\n",
                        responseBody.Length
                        );
                byte[] responseHeaderBytes = utf8.GetBytes(responseHeader);

                // 向客户端发送状态信息
                client.Send(statusLineBytes);
                // 向客户端发送回应头
                client.Send(responseHeaderBytes);
                // 头部与内容的分隔行
                client.Send(new byte[] { 13, 10 });
                // 向客户端发送内容部分
                client.Send(responseBodyBytes);

                // 断开与客户端的连接
                client.Close();
                if (Console.KeyAvailable)
                    break;
            }
            // 关闭服务器
            socket.Close();
        }

运行效果如下:

服务端开始监听端口image

客户端:

服务器端接收到请求后:image

因此从本质上讲,ASP.NET 本身就是一个网络服务程序。这个服务程序通过HTTP现已与客户端进行通信,响应客户端发出的请求,并回应处理结果。