文章目录

动因

HTTPWATCH

用IE访问服务器端的一张png图片

观察数据

结论

本文说明了http协议传输图片的交互数据的过程和测试方法。

动因

学习编程,其实不在于编程本身。千万不要满足于会调用现成的函数。很多人都知道,通过浏览器访问一张图片链接,服务器就会返回图片,于是浏览器就月显示出来。真那么简单么,细节是什么?为了从零开始实现服务器与浏览器的交互,我们必须去了解http协议,然后才是编程实现。

了解http协议的方法是:

(1)阅读协议本身。

(2)通过实验观察别人已经实现的协议的工作过程。

一般,读协议本身是必要的,但只靠”读“并不能真正了解协议本身。有一句话说得好:衡量你是否真正理解一个原理,在于你是否使用程序实现了这个原理,你要懂,就要让计算机先懂。通过实验能看到通信协议工作的活生生的过程,是理解通信协议最好的办法。记住,你永远不可能在岸上学会游泳!

http协议是一种基于文本的应用层传输协议,我们可以通过一些协议分析工具来观察信息的传输过程。

HTTPWATCH

我在这里选用了一款强大的网页数据分析工具HttpWatch 。安装了HttpWatch后, 将集成在Internet Explorer中,能够收集并显示浏览器与服务器交互过程的底层信息。能够在显示网页同时显示网页请求和回应的日志信息。甚至可以显示浏览器缓存和IE之间的交换信息。集成在Internet Explorer工具栏。

图为安装后,打开IE浏览器的应用界面。

我们就用HttpWatch来分析浏览器和web服务器之间的交互消息吧。

用IE访问服务器端的一张png图片

讲用http协议访问文本的例子网上很多,如我在”VC++6.0下用60行程序写成一个最简单的WEB服务器“一文中已描述的。 为了实现自己编写的服务器程序能返回图片数据,就必须了解成熟的web服务器(如IIS,Apache,Tomecat等)是如何处理图片数据请求并作出响应的。

可以用任意网站上的图片链接作为测试实验对象。例如,我以

http://www.wtclab.net/newwtc/assets/images/teachers/shaoyubin.jpg

作为访问对象。

安装好HTTPWATCH后,打开IE浏览器(Win10下,IE11),鼠标右键可调出HTTPWATCH应用界面。如上图示。

(1)如果上一次用过,可能有缓存,可用HTTPWATCH的Tools菜单清除之,以保证与我的实验结果相同

(2)连接上互联网,调出HTTPWATCH应用界面并清除缓存后,点击菜单项上的Record 进行数据记录。

(3)在浏览器地址栏输入链接地址并回车。

将发现浏览器中显示出照片,同时HTTPWATCH应用界面中会给出交互数据来。如下:

(4)完成数据记录后,点击stop 停止记录。采用Export工具可将数据导出为文本格式。例如,将浏览器请求数据导出为shaoyubin.jpg.request.txt,而将服务器响应数据导出为shaoyubin.jpg.response.txt.

观察数据

浏览器请求数据 shaoyubin.jpg.request.txt的内容是:

GET /newwtc/assets/images/teachers/shaoyubin.jpg HTTP/1.1Accept: text/html, application/xhtml+xml, image/jxr, */*X-HttpWatch-RID: 70513-10228Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like GeckoAccept-Encoding: gzip, deflateHost: www.wtclab.netConnection: Keep-Alive

其中,第一行说明了要请求的资源位置和使用HTTP的版本。其他行含义参见HTTP协议描述,这里不过多解释。总之是告诉服务器:我是谁(User-Agent),我能接收哪些格式的消息(Accept,Accept-Language,Accept-Encoding),要请求服务器做什么(GET),完成后是否保持连接(Connection)等等。

服务器收到如上消息后,返回响应为shaoyubin.jpg.response.txt。可用notepad++ 编辑器打开。如下图示:

以16进制显示为:

可见返回消息中,既有文本形式的http报文头,又有纯二进制图片数据。http报文头以两个空行(0d 0a 0d 0a)为结束标志,之后的报文数据(对于图片,就是图片文件的二进制流)。

HTTP报文头为:

HTTP/1.1 200 OKContent-Type: image/jpegLast-Modified: Fri, 23 Jun 2017 02:47:38 GMTAccept-Ranges: bytesETag: "7a849613cbebd21:0"Server: Microsoft-IIS/7.0X-Powered-By: ASP.NETDate: Wed, 31 Oct 2018 13:54:28 GMTContent-Length: 36993

第一行表示服务器能正确响应。

第二行说明了返回消息的类型为image/jpeg,以便浏览器能调用相应要方法解析并显示出来。最末行(9行)说明了图片文件的大小字节数。其他行分别说明了服务器的身份(IIS 7),资源最后修改日期,当前时间等等,详细解释搜索百度相应词字即可。

在notepad++中,小心地将前10行删掉,即只剩下纯数据部分,将之另存为如sybrecvdat.jpg,这时将得到一个完整的jpg文件,查看大小,正好是Content-Length: 36993 字节。

这就验证了回传数据的确是完整的二进制流。

结论

所以, 要自己实现能回传图片的服务器,只需依照如上协议回传正确的http头后,接着传输相应文件的二进制流即可。

本文说明了http协议传输图片的交互数据的过程和测试方法。

---------------------

原文:https://blog.csdn.net/shaoyubin999/article/details/83590764

ie浏览器能显示ftp协议的图片_浏览器向服务器请求一张图片,到底发生了什么?...相关推荐

  1. 从浏览器输入http://www.baidu.com,到看到百度主页的过程中到底发生了什么?

    从浏览器输入http://www.baidu.com,到看到百度主页的过程中到底发生了什么? 网络模型 1. 根据网络七层模型,浏览器和服务器都可以认为是应用层的一个应用, 2. 所以本质上来说就是从 ...

  2. 里面怎么缓存图片_浏览器缓存原理总结

    一.浏览器缓存基本认识 分为强缓存和协商缓存 1.浏览器在加载资源时,先根据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务 ...

  3. java web 显示项目下的图片_[适合初中级Java程序员修炼手册从0搭建整个Web项目](一)...

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206种一棵树最好的时间是十年前,其次是现在 six-finger-web 一个Web后端 ...

  4. 浏览器怎么显示php文件夹,如何使用浏览器打开php文件?

    如何使用浏览器直接打开运行php文件? 第一步:配置php运行环境 第二步:将文件放置根目录 网站根目录就是你的环境下www文件下,必须将文件放置此位置才算有效,否则无法运行php文件. 第三步:检查 ...

  5. bootstrap-switch 不起作用 class处显示代码_注解KafkaListener不起作用,到底发生了啥?...

    一,漫谈消息队列 众所周知,消息队列主要是用于消峰,解藕.同时也使得业务的处理方式为异步处理.常用的消息队列有rabbitmq,activemq,rocketmq,kafka等等,考虑到Kafka已经 ...

  6. 十三水牌型 图片_十三水,得玩法到底有多少种!

    特殊牌型 至尊清龙:同花色的从1(A)-13(k) 一条龙:从1(A)-13(k) 十二皇族:12张都是10以上的牌 三同花顺:三墩都是同花顺 三分天下:13张牌出现3副炸弹加一张杂牌(或称三套四梅. ...

  7. ftp协议是一种用于_______的协议_网络安全常见协议解析:TCP、UDP、HTTP、FTP、SMTP等之间的区别...

    了解网络安全行业的都知道,网络安全协议是营造网络安全环境的基础,是构建安全网络的关键技术.常见的网络协议如HTTP协议.TCP/IP协议.FTP协议等. 如果你想进入网安行业,这些协议都是需要重点要学 ...

  8. chorme和FireFox浏览器不显示按钮的问题

    在IE浏览器下正常显示的画面 在Chorme下显示的画面 在FireFox下显示的画面 DE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolv ...

  9. vue下载大文件时浏览器不显示下载进度

    vue下载大文件时浏览器不显示下载进度 问题描述 最近开发中遇到个问题,项目需要下载大文件(音视频),由于后端给我的是视频的地址而不是直接返回流,所以前端用了XMLHttpRequest获取视频流并实 ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(七)- ROS与arduino连接
  2. hibernate 复合主键 根据主键删除_hibernate封装Utils工具类
  3. 一起从头学习Flex
  4. 《剑指offer》第十八题(在O(1)时间删除链表结点)
  5. python 到 poc
  6. 【云速建站】按照给定模板从0开始编辑网站页面
  7. 【转载】谷歌是如何做代码审查的
  8. django.template.exceptions.TemplateSyntaxError: ‘staticfiles‘ is not a registered tag library. Must
  9. 阿里有php的研发团队么,【阿里巴巴】阿里集团-MMC技术部-研发工程师JAVA
  10. BoneCP主要配置参数
  11. 企业面试之LeetCode刷题心得
  12. ue4 模板类实例化_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...
  13. android 8原生系统下载地址,android8.0下载地址 android8.0系统下载网址
  14. 高中计算机网络技术因特网协议,高中信息技术网络协议.ppt
  15. json的格式是什么?
  16. java 找出重复的数字
  17. 北京航空航天大学计算机考研难度,北京航空航天大学考研难吗?一般要什么水平才可以进入?...
  18. 汽车芯片:缺货将诱发产业变革
  19. 那些年的成长,爱情的总结
  20. 卷积、转置卷积、可分离卷积、分组卷积、空洞卷积的理解

热门文章

  1. php+投票排序,关于phpcms v9投票模块选项排序listorder设定问题修改
  2. 一个屌丝程序猿的人生(七十二)
  3. 360wifi 2代 linux驱动安装 ubuntu 14.04
  4. tidb集群安装部署
  5. 字符串题目:解码字母到整数映射
  6. Vue 彩色头像|一个有趣的头像生成器 附源码
  7. C#使用WinAPI中 WinExec 调用外部exe程序
  8. 用tim从左到右移动帧(感兴趣区域)的Moviepy裁剪视频
  9. js与jquery的选项卡切换
  10. PWM脉冲频率可调模块