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

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

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

  1. 详谈socket请求Web服务器过程

    最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...

  2. 【网络开发】详谈socket请求Web服务器过程

    最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有"连接建立"的发生 ...

  3. C#中使用Socket请求Web服务器过程

    最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...

  4. TCP/IP协议学习(七) 基于C# Socket的Web服务器---动态通讯实现

    目录 (1).基于Ajax的前端实现 (2).Web服务器后端处理 一个完整的web服务器,不仅需要满足用户端对于图片.文档等资源的需求:还能够对于用户端的动态请求,返回指定程序生成的数据.支持动态请 ...

  5. TCP/IP协议学习(四) 基于C# Socket的Web服务器---静态资源处理

    目录 1. C# Socket通讯 2. HTTP 解析引擎 3. 资源读取和返回 4. 服务器测试和代码下载 Web服务器是Web资源的宿主,它需要处理用户端浏览器的请求,并指定对应的Web资源返回 ...

  6. 第一篇 先用socket模拟web服务器

    一.用socket来模拟网站访问 socket为python2.7 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket def han ...

  7. Socket模拟Web服务器

    效果如下: 源码下载地址:https://github.com/doyoulaikeme/DotNetSample/tree/master/DotNetSample3/SocketWebServer

  8. C#中使用Socket实现简单Web服务器

    上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 熟悉Socket编程: 熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重 ...

  9. atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener

    atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener 1. 自定义web服务器的实现方案,基于原始socket vs   ...

随机推荐

  1. 用Java写个ftp传输类实现文件的上传和下载,用ikvmc转成dll

    1.Java类: package com.wjy.ftp.transmission; import java.io.File; import java.io.FileOutputStream; imp ...

  2. Java8高中并发

    Java8中学并发 本文翻译自:http://jaxenter.com/lean-concurrency-in-java-8-49924.html 转载请注明出处:http://blog.csdn.n ...

  3. cocos2dx 3.1从零学习(六)——CocosStudio(VS2013project导入及环境设置)

    导入libCocosStudio.libExtensions.libGUI 新建的project例如以下图: 加入现有项目 右键解决方式.例如以下操作: watermark/2/text/aHR0cD ...

  4. Windows phone 8 学习笔记(8) 定位地图导航

    原文:Windows phone 8 学习笔记(8) 定位地图导航 Windows phone 8 已经不使用自家的bing地图,新地图控件可以指定制图模式.视图等.bing地图的定位误差比较大,在模 ...

  5. HDU2586 How far away ?(LCA模板题)

    题目链接:传送门 题意: 给定一棵树,求两个点之间的距离. 分析: LCA 的模板题目 ans = dis[u]+dis[v] - 2*dis[lca(u,v)]; 在线算法:详细解说 传送门 代码例 ...

  6. hdu 5017 Ellipsoid(西安网络赛 1011)

    Ellipsoid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  7. sitemap.xml

    内部类  在类内部的类 1.解决多继承 2.解决继承和实现接口时候方法名冲突情况 3.实现数据隐藏 只有内部类可以拥有4种访问修饰符 当内部类为private的时候,有外部类提供方法来访问内部类 常规 ...

  8. 参数化测试--sheet表的应用

    自动化测试对录制和编辑好的测试步骤进行回放,这种是线性的自动化测试方式,其缺点是明显的,就是其测试覆盖面比较低.测试回放的只是录制时做出的界面操作,以及输入的测试数据,或者是脚本编辑时指定的界面操作和 ...

  9. leetcode先刷_Binary Tree Level Order Traversal II

    非常easy标题,在后面,我不认为它不是那么简单的回答更多的.我们将编写,没有人啊. 预购在基层上,加上节省每一层,加上从下往上的输出,是一家vector而一个stack那么问题,没有他,但另一方面- ...

  10. .NET垃圾回收笔记

    名词 垃圾收集目标 ephemeral GC 发生在Gen 0 和Gen 1 的垃圾收集 Full GC 发生Gen 2 及以上的Gen与LOH的垃圾收集 垃圾收集模式 工作站模式 GC直接发生在内存 ...