详谈socket请求Web服务器过程(转)

 

最开始我们需要明白一件事情,因为这是这篇文章的前提:

HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的。因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生。

而有人或许会问:众所周知,HTTP协议有两大特性,一个是“无连接”性,一个是“无状态”性。这里的“无连接”岂不是跟上面的说法有冲突?其实这里并没有矛盾,只是人们对“连接”这个词的理解有差异。首先我们来看一下浏览器向Web服务器发出Http请求以及Web服务器给浏览器回复的过程:

1)浏览器创建Socket,按给定IP(域名)和端口(默认为80)连接服务器。比如使用类似Socket.Connect()、Socket.BeginConnect()等方法;

2)连接成功后,浏览器依据HTTP协议规范(关于协议,后面有讲到),向Web服务器发送请求数据。比如“请求行”、“请求头标”以及“请求数据”等,这里可能使用类似Socket.Send()、Socket.BeginSend()等方法。【关于HTTP协议中的请求行、请求头标等请参见http://www.cnblogs.com/visec479/diary/2014/09/15/3972715.html

3)浏览器等待服务器处理并返回数据;

4)Web服务器端使用Socket.Accept()、Socket.BeginAccept()等方法侦听到浏览器的连接后,便开始接收浏览器发送的数据。接收到请求数据后,依据HTTP协议规范解析数据,然后处理,最终将处理结果(如html文档)发回给浏览器,这里可能用到类似Socket.Send()、Socket.BeginSend()等方法;

5)Web服务器发送完处理结果后,关闭Socket;

6)浏览器接收Web服务器发回的数据(如html),将其显示在浏览器UI界面。关闭socket;

7)一次“浏览器到Web服务器”的http请求结束;

8)下一次浏览器需要请求Web服务器,跳转到第1)步循环开始。

用图表示以上过程:

图1

如上图1所示。浏览器向Web服务器发送http请求之前,需要先建立连接。没错,它们间建立连接的过程跟我们平时开发socket程序类似。由此可知,HTTP协议的“无连接”特性并不是指:浏览器与Web服务器进行数据交换时,不需要建立连接。那么“无连接”特性到底指什么呢?我们再看图1会发现,浏览器每次请求完毕后都会与服务器处于“断开”状态,下一次请求时再重新与服务器建立连接。HTTP的无连接特性恰恰就是指浏览器的每次请求都必须重新与服务器建立连接,正常情况下,浏览器不会与Web服务器保持长时间的连接状态。现将HTTP协议的两大特性归结如下:

无连接:

服务器与浏览器之间的一次连接只处理一个http请求,请求处理结束后,连接断开。下一次请求再重新建立连接。

无状态:

服务器不会保存浏览器信息。也就是说,在服务器端,第一次http请求处理的结果不会保留到第二次请求。如果第二次请求处理时,需要用到第一次请求处理的结果,浏览器在第二次请求时,必须将第一次处理结果重新传回给Web服务器(比如使用cookie)。

关于“协议”:

       这个话题有点大,不是我能掌控得了的。不过对于今天这篇文章,我还是尽最大可能说一点。计算机中协议范畴广泛,单就网络通信中的协议,就不计其数,OSI七层中每层都很多种协议。那么协议到底本质上是个什么东西呢?单就通信中的协议来讲,协议的本质其实就是一种数据结构,类似代码中的结构体,说得再底层一点,就是一个字节流,规定好了第一个字节代表什么、第二个字节代表什么等等。

      协议的作用跟我们平时所说的“契约”、“约定”类似,一个团队合作的任务,合作各方必须同时遵守事先的约定,最后工作才能正常进行下去。网络通信中也一样,通信双方收/发数据时必须按照实现规定好了的结构去发送/接收,一方不遵守该规范,通信就不能成功。这里说的结构规范其实就是“协议”。协议有以下作用:

1)既然是规范,那么按照规范做事,自己做的别人更容易理解,便于交流;

2)将规范写成文档,提供给其他人,方便后期他人扩展。因为只要知道了通信规范,那么很容易就可以编写出扩展模块与原有系统协调工作。

3)计算机网络通信中,有些因素决定了我们必须按照规定的格式收发数据,比如TCP通信中,由于数据是按照“流”式传输的,如果我们事先不定义数据传输规范,那么很难判断TCP传输的数据边界。

就网络通信协议来讲,应用层协议与我们程序开发最为密切(至少对我们使用c#、java的人来讲),其他向tcp、udp等传输层协议几乎用不到。我们开发的通信程序,必须遵守实现定义好了的应用层协议,比如浏览器和Web服务器都遵守了HTTP应用层协议,只有这样,它们才能正常交互。倘若我们自己开发一个程序,正确地遵守了HTTP协议,那么我们的程序也能够像chrome、IE等浏览器一样,去访问Web服务器。

     文章末尾有一个使用socket模拟浏览器请求Web服务器的demo,实现的功能我们完全可以使用类似WebClient、WebRequest等类型去实现。demo功能如下:

1)使用Socket连接Web服务器(任意);

2)按照HTTP协议格式发送HTTP请求(使用Socket.Send方法);

3)按照HTTP协议格式解析Web服务器返回的数据(其实就显示在了UI界面)

(开发这样的程序需要我们充分熟悉socket编程、HTTP协议格式)

以下是发送HTTP请求的代码:

 1 /// <summary>
 2 /// 发送请求
 3 /// </summary>
 4 /// <param name="socket"></param>
 5      private void SendRequest(Socket socket)
 6      {
 7          string h1 = "GET " + _path + " HTTP/1.1\r\n";
 8          string h2 = "Accept: */*\r\n";
 9          string h3 = "Accept-Language: zh-cn\r\n";
10          string h4 = "Host: " + _host + "\r\n";
11          string h5 = "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36\r\n";
12          string h7 = "Connection: close\r\n\r\n";
13
14          byte[] send_buffer = Encoding.UTF8.GetBytes(h1 + h2 + h3 + h4 + h5 + h7);
15          socket.Send(send_buffer);
16          Print("请求发送完毕,等待Web Server回复...");
17          socket.BeginReceive(_buffer, 0, 640 * 1024, SocketFlags.None, new AsyncCallback(OnReceive), socket);
18     }            

主程序:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Windows.Forms;
 5
 6 namespace socket_browser
 7 {
 8     static class Program
 9     {
10         /// <summary>
11         /// 应用程序的主入口点。
12         /// </summary>
13         [STAThread]
14         static void Main()
15         {
16             Application.EnableVisualStyles();
17             Application.SetCompatibleTextRenderingDefault(false);
18             Application.Run(new Form1());
19         }
20     }
21 }

 

 Demo下载:

http://yunpan.cn/Q75bZUrw8n5nb  访问密码 c961

 

 

http://www.cnblogs.com/visec479/p/3972728.html

时间: 2024-10-28 09:11:18

详谈socket请求Web服务器过程(转)的相关文章

搭建基于Linux 6.3+Nginx 1.2+PHP 5+Mysql 5.5的Web服务器过程详解

之前的Web服务器都是通过yum搭建的,想要添加新模块或者更新某些软件都很不方便(牵一发而动全身啊!).所以,现在准备将环境改为源码编译安装,这样便于调整,性能上也会比yum方式好很多.以下是我的安装步骤,我的系统是CentOS 6.3 64位. 注意:本文所以配置都是基于第二步所下载的软件版本,安装其他版本不保证会成功 一:安装依赖包 123456 yum install cmake make gcc gcc-c++ libjpeg libjpeg-devel libpng \ libpng-

Java的网络编程:用Java实现Web服务器

web|web服务|web服务器|编程|网络 超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一,同样,HTTP 也是基于 C/S 或 B/S 模型实现的.事实上,我们使用的浏览器如Netscape 或IE 是实现HTTP 协议中的客户端,而一些常用的Web 服务器软件如Apache.IIS 和iPlanet Web Server 等是实现HTTP 协议中的服务器端.Web 页由服务端资源定位,传输到浏览器,经过浏览器的解释后,被客户所看

用Java实现Web服务器

一.HTTP协议的作用原理 WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页.WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信.HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的.无状态的.面向对象的协议.HTTP协议的作用原理包括四个步骤: (1) 连接:Web浏览器与Web服务器建立连接,打开一个称为soc

C#实现WEB服务器

web|web服务|web服务器 这只是一个简单的用C#写的WEB服务器,只实现了get方式的对html文件的请求,有兴趣的朋友可以在此基础之上继续开发更多功能,小弟学c#不久,如有错漏,望请见凉!! 摘要: WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,HTTP协议的作用原理包括四个步骤:连接,请求,应答.根据上述HTTP协议的作用原理,本文实现了GET请求的Web服务器程序的方法,通过创建Tcp

用C#实现Web服务器

WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,HTTP协议的作用原理包括四个步骤:连接,请求,应答.根据上述HTTP协议的作用原理,本文实现了GET请求的Web服务器程序的方法,通过创建TcpListener类对象,监听端口8080: 等待.接受客户机连接到端口8080: 创建与socket字相关联的输入流和输出流;然后,读取客户机的请求信息,若请求类型是GET,则从请求信息中获取所访问的HTML文

利用Java实现Web服务器

一.HTTP协议的作用原理 HTTP协议的工作原理包括四个步骤: 1.连接:Web浏览器与Web服务器建立连接. 2.请求:Web浏览器通过socket向Web服务器提交请求. 3.应答:Web浏览器提交请求后,通过HTTP传送给Web服务器.Web服务器接到请求后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面. 4.关系连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接. 二.用Java实现

基于HttpListener的web服务器

写在前面 前面两篇文章分别介绍了基于原始socket的web服务器和基于tcpListener的web服务器,本篇文章将继续介绍另外一种基于HttpListener的. HttpListener HttpListener进一步的简化了Http协议的监听,仅需通过字符串的方法提供监听的地址和端口号以及虚拟路径,就可以开始监听工作了. using System; using System.Collections.Generic; using System.Linq; using System.Net

Servlet学习之web服务器Tomcat 详解

  Web服务器是什么 Web服务器是指驻留于因特网上某种类型计算机的程序.当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型).服务器使用HTTP(超文本传输协议)进行信息交流,这就是人们常把它们称为HTTPD服务器的原因. Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上运行脚本和程序. Web服务器可以解析HTTP协议.当Web服务器接收到一个HTTP请求,会返回一个HTT

web服务器有自己的缓存吗?????除了http协议上规定的缓存。。。

问题描述 is对于图片有没有服务器端的缓存,,这里感觉http协议的缓存都已经排除了,,为什么请求web服务器他返回的还是说StatusCode:304NotModified(fromcache)如图所示:客户端缓存时间为0啊,所以按照http协议里说的,服务器端要对比If-Modified-Since和文件的修改时间的啊...明明请求的If-Modified-Since:Tue,01Mar201603:47:17GMT是老文件的修改时间了,,新的文件修改时间和这个不一样,,,为啥web服务器还