`
seara
  • 浏览: 624308 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java网络编程从入门到精通(23):HTTP消息头字段

阅读更多
本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(22):实现HTTP模拟器

一、通用头字段

1. Connection

这个字段只在HTTP1.1协议中存在。它决定了客户端和服务器进行了一次会话后,服务器是否立即关闭网络连接。在客户端最直接的表现是使用read方法(readLine方法也是一样)读完客户端请求的Web资源后,是否立即返回-1readLine返回null)。Connection有两个值:CloseKeep-Alive。当使用ConnectionClose时,和HTTP1.0协议是一样的,当read方法读完数据时立即返回;而使用ConnectionKeep-Alive时,read方法在读完数据后还要被阻塞一段时间。直接读取数据超时时间过后,还继续往下执行。在上一篇文章中讨论的readHttpResponse(...)方法实现的第011行可以验证Connection的作用。下面让我们来使用HTTP模拟器来做一个实验。

(1)在HTTP模拟器中输入如下的域名:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->www.baidu.com

(2)HTTP模拟器中输入如下的HTTP请求信息:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->GET/HTTP/1.1
Host:www.baidu.com

(3)按两下回车(输入一个空行)后,发送请求消息,并得到如图1如示的HTTP响应消息头:


图1

(4)输入yY后(在显示http响应头后,要立刻输入Y或y),显示响应消息的内容。在显示完内容后,大约过了10秒钟才进入"host:port>"提示符(因为在sendHttpRequest()的实现代码中的004行设置了读取数据超时)。

(5)在"host:port>"提示符下直接按回车,输入最近一次使用的域名www.baidu.com和80端口。再次输入如下的HTTP请求:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->GET/HTTP/1.1
Host:www.baidu.com
Connection:close

输入完以上的HTTP请求后,重新执行第3、4步操作。最后在显示HTTP响应消息内容后,直接直入了"host:port>"提示符。除了这种方法,将请求的第一行改为GET / HTTP/1.0。这样也可以无需等待直接结束。

通过设置Connection,可以在下载Web资源(如多线程下载工具、Web浏览器等)后,立即断开网络连接,这样可以有效地降低客户机的资源消耗。

2. Date

这个Date头字段描述了请求消息和响应消息被创建的时间。这个字段值是一个HTTP-date类型,它的格式必须是GMT(格林尼治)时间,GMT时间是就是北京时间减8小时。下面是Date字段的一个例子:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Date:Tue,15Nov200708:12:31GMT

3. Content-Length

指定消息实体的字节数。在请求消息中POST方法必须使用Content-Length来指定请求消息的实体内容的字节数。在响应消息中这个字段值指定了当前HTTP响应所返回的Web资源的字节数。

二、HTTP请求消息头字段

1. Host

Host字段用于指定客户端所访问的资源所在的主机名和端口号。如果端口号等于连接服务器时所使用的端口号,则端口号可以省略。下面是一个使用Host字段的一个例子:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Host:www.sina.com.cn

这个字段是必须的,如果HTTP请求不包含这个字段,服务器将返回400(Bad Request)响应状态。

2. Accept

Accept字段头确定客户端可以接收的媒体类型。一般的格式是"*/*""类型/"子类型"。这个子段头可以传递多个媒体类型,中间用""隔开。如下面是一个Accept的例子:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->Accept::image/gif,image/jpg

如果请求头使用上述的Accept字段值,则服务器端在动态生成网页的IMG头时将首先包含gif格式的图像,如果gif图象不存在,则包含jpg格式的图象。

3. User-Agent

这个字段头用于指定客户端是用什么访问的服务器,如果是IE6浏览器,并且本机安装了.net 2.0,则User-Agent会有如下的值:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->User-Agent:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.2;SV1;Maxthon;.NETCLR1.1.4322;.NETCLR2.0.50727;InfoPath.1;InfoPath.2)

服务器可以通过这个字段检查客户机的浏览器版本,并根据不同的版本来确定向客户端发送的数据。

4. Range

Range字段头通过服务器只传输一部分Web资源。这个字段头可以用来实现断点续传功能。有很多下载工具就是通过这个字段头进行断点续传的。Range字段可以通过三种格式设置要传输的字节范围:

(1)Range: bytes=1000-2000

传输范围从10002000字节。

(2)Range: bytes=1000-

传输Web资源中第1000个字节以后的所有内容。

(3)Range bytes=1000

传输最后1000个字节。

三、HTTP响应消息头字段

1. Accept-Ranges

这个字段说明Web服务器是否支持Range(是否支持断点续传功能),如果支持,则返回Accept-Ranges: bytes,如果不支持,则返回Accept-Ranges: none

2. Content-Range

指定了返回的Web资源的字节范围。这个字段值的格式是:

开始字节位置结束字节位置/Web资源的总字节数

下面是一个使用Content-Range的例子:

Content-Range1000-3000/5000

测试

HTTP模拟器中连接服务器files.cnblogs.com,并输入如下的HTTP请求消息:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->GET /nokiaguy/HttpSimulator.rar HTTP/1.1
Host:
files.cnblogs.com
Range:bytes=1000-

返回的响应消息头如图2所示:

图2

从上图可以看出,服务器files.cnblogs.com支持断点继传功能。而且还可以验证Content-Length的值是当前会话传过来的字节数,并不是Web资源的总的字节数。而Content-Range字段值中"/"后面的数才是Web资源总的字节数。

3. Location

这个字段指定了上哪个新地址获得新的Web资源。当Web资源更换URL后,而一些老用户不能及时得知这个新的URL;因此,在老用户访问原来的URL时,使用Location将这个新的URL返回给客户端。这个地址转换对用户来说是完全透明。

下一篇:
Java网络编程从入门到精通(24):实现HTTP断点续传下载工具(附源代码)



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    Mycat从入门到精通视频教程

    Mycat从入门到精通视频教程目录介绍: 第1课 Mycat前世今生 Mycat的历史、背后的团队、发展现状、RoadMap等 第2课 Mycat原理与入门 Mycat的原理、主要功能、配置和使用入门 第3课 Mycat故障排查指南 常见...

    scala从入门到精通技术教学视频

    1,知识体系完备,从小白到大神各阶段读者均能学有所获。 2,生动形象,化繁为简,讲解通俗易懂。 3,结合工作实践及分析应用,培养解决实际问题的能力。 4,每一块知识点, 都有配套案例, 学习不再迷茫。 课程简介 ...

    Java实体类字段生成工具类-将数据库表列字段转为Java实体类驼峰字段

    1、在Java开发中,常常需要将数据库表列字段换成Java实体类字段。但是手动实现这个转换过程比较慢,且容易出错,影响开发效率。为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表...

    2018教程读书笔记之oracle从入门到精通

    边看李兴华视频边记的,适合初学者去看,毕竟看文本比看视频要快吧。 ...  最大权限 conn sys/change_on_install as sysdba;  关键词:SELECT、FROM、WHERE、GROUP BY、HAVING、... ----为特定字段设置宽度,A代表宽度

    java 编程入门思考

    第15章 网络编程 15.1 机器的标识 15.1.1 服务器和客户机 15.1.2 端口:机器内独一无二的场所 15.2 套接字 15.2.1 一个简单的服务器和客户机程序 15.3 服务多个客户 15.4 数据报 15.5 一个Web应用 15.5.1 服务器应用...

    水晶报表从入门到精通

    第3章 格式化字段和对象 第二部分 使报表元素生效 第4章 使用公式车间添加事务逻辑 第5章 使用水晶报表创库 第6章 汇总信息 第7章 使用数据值选择性地精选报表 第8章 自定义部件 第三部分 高级报表 第9章 处理多个...

    水晶报表从入门到精通(下)

    第一部分 报表编写基础第1章 创建一个报表第2章 修改报表第3章 格式化字段和对象第二部分 使报表元素生效第4章 使用公式车间添加事务逻辑第5章 使用水晶报表创库第6章 汇总信息

    EXCEL数据透视表之从入门到精通

    2、使用数据透视表可以按照数据表格的不同字段从多个角度进行透视,并建立交叉表格,用以查看数据表格不同层面的汇总信息、分析结果以及摘要数据。 3、使用数据透视表可以深入分析数值数据,以帮助用户发现关键数据,并...

    JIRA 从入门到精通.doc

    《JIRA 从入门到精通》,doc 格式,大小 2.9MB。图文并茂,手把手教你学习 JIRA。 内容预览: JIRA入门到精通 ——hjjlearning,2008.06.27 第一章、 JIRA介绍 跟踪并管理在项目开发和维护过程中出现的问题(如:缺陷...

    水晶报表从入门到精通(中)

    第一部分 报表编写基础第1章 创建一个报表第2章 修改报表第3章 格式化字段和对象第二部分 使报表元素生效第4章 使用公式车间添加事务逻辑第5章 使用水晶报表创库第6章 汇总信息

    java如何获得数据库表中各字段的字段名

    java如何获得数据库表中各字段的字段名

    Java并发编程的艺术.md

    《Java并发编程的艺术》笔记 第一章 并发编程的挑战 第二章 Java并发机制的底层实现原理 volatile的两条实现原则: 1. Lock前缀指令会引起处理器缓存回写到内存 2. 一个处理器的缓存回写到内存会导致其他...

    Java编程思想(完整版)

    第1章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善基础类: 尽管extends关键字暗示着我们要为接口“扩展”新功能,但实情并非肯定如此。为...

    SAP 用户权限学习从入门到精通

    原创, SAP权限管理的学习心得。详细介绍了SAP权限管理的核心

    SQL Server从入门到精通(三)

    引用完整性:要求量表相同字段必须一致 主键: v表中一列或几列组合的,能够唯一的标识表中的每一行 √一个表只能有一个主键 √多列组合当主键称为复合主键其值自动被填入 原则:最少性和唯一性 外键: √相对应于...

    kettle通过java代码将数据库blob 字段抽取到本地文件

    kettle通过java代码将数据库blob 字段抽取到本地文件

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    java实体类字段自定义-数据库字段和程序实体类属性不一致解决方案.docx

    java实体类字段自定义-数据库字段和程序实体类属性不一致解决方案.docx

    arcgis自动导入字段:利用模板批量导入字段tbx

    1.从已打开的图层导出字段属性到txt 将模板用arcmap打开(注意:要选择内容列表-按绘制顺序列出显示图层),点击此功能,系统自动读取模板的字段(字段属性包括字段名称,字段类型,字段长度,字段精度,保留小数位)...

    视频教程读书笔记之oracle从入门到精通

    2. 自然连接:NATURAL JOIN,自动使用关联字段消除笛卡儿积(一般关联字段是外键,但是此处它是以名称为主),属于内连接的概念。 SELECT * FROM emp NATURAL JOIN dept; 在返回查询结果的时候,默认情况下会将关联...

Global site tag (gtag.js) - Google Analytics