熟悉java的同学,都知道javaEE当中很大一部分的内容,是WEB开发,那么在进行WEB开发的学习过程当中,除了需要学习SpringMVC/STRUTS2等框架以外,我们还需要对在WEB开发当中常用到的协议有所了解,那就是HTTP协议,今天就简单的记录一下自己学习HTTP协议的一些内容吧。文中参考了许多前人写的博客以及自己的一些理解,在文中末尾会进行参考标注。

  首先我们先大体了解一下什么是HTTP协议,所谓的HTTP协议,全称:超文本传输协议,是用于从WEB服务器传输超文本(各类前端代码,如html等)到本地浏览器的传送协议。它是一个传输层基于TCP的应用层协议,它工作于客户端-服务端架构为上,浏览器(HTTP客户端)通过URL向HTTP服务端(WEB服务器)发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。它主要有以下特点:

1.简单快捷:客户端向服务端请求服务的时候,只需要传输请求方法(put、get、post、delete等)和URL即可(有的时候请求当中还需要携带body,这是后话)。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

2.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记(如有兴趣知道它可以传输什么类型的内容,可以查询以下Content-Type的类型表格)。

3.无连接:所谓的无连接,就是说HTTP是一个请求-响应的形式协议,即客户端发起一次请求,服务器相应该请求之后即断开连接。采用这种方式可以节省传输时间。

4.无状态:指协议对于事务处理没有记忆能力。优点是:在服务器不需要先前信息时它的应答就较快。但其缺点也很明显:在缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

在大体了解了HTTP协议的内容和特点,我们再从细节介绍一下HTTP协议常涉及的一些重点,在特点1当中我们提到,HTTP只需要传输请求方法和URL即可,那么什么是URL呢?

HTTP之URL

  URL全称:统一资源定位符,是互联网上用来标识某一处资源的地址。所谓标识某一处资源地址的意思就是,通过这个URL,我们可以在互联网上找到这个资源,再形象点比如,这个就相当于快递要寄到家里时,需要查看的寄件地址。那么我们通过一个例子来看看URL是由哪几个部分组成的。

http://www.mycomputer.com:8080/wellhold/test/index.jsp?name=wellhold

通过这个地址我们来分析一下一个完整的url是由哪几部分组成的:

协议部分:http

域名部分:www.mycomputer.com,有时候可以是唯一的IP地址表示(实际上域名最后还是会被DNS映射到IP地址的)

端口号部分:8080

虚拟地址部分:/wellhold/test/,表示可以在上述域名的服务器的这个地址找到该HTTP请求想要的资源

请求文件名:index.jsp,想要的资源名称

参数部分:name=wellhold,请求当中需要携带的参数(参数部分不是必须的)

通过这个例子,就可以看出一个完整的URL主要分为了以上几个部分。

那么了解了URL之后,我们发现在介绍URL的时候,总是提到一个HTTP请求,那么HTTP请求当中究竟有什么东西了?接下来我们介绍一下HTTP请求。

HTTP Request(请求)

一个完整的HTTP Request主要包含了以下部分:请求行(request line)、请求头部(header)、空行、请求数据。二话不说,先上一张图:

再通过一个例子来说明:

POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive name=Professional%20Ajax&publisher=Wiley

第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。

其实也是很简单明了的东西,这里就不再进行赘述了,接下来我们再了解了解HTTP当中的response

HTTP RESPONSE(响应)

http的相应也主要是由四个部分组成:状态行、消息报头、空行和正文。

第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

第二行和第三行为消息报头,Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8

之后接着一行空行

最后接着就是正文。

附:关于http当中的状态码含义

1xx:指示信息--表示请求已接收,继续处理

2xx:成功--表示请求已被成功接收、理解、接受

3xx:重定向--要完成请求必须进行更进一步的操作

4xx:客户端错误--请求有语法错误或请求无法实现,400:请求有语法错误、404:资源不存在、401:请求未授权、403:服务器拒绝服务

5xx:服务器端错误--服务器未能实现合法的请求,500:服务器发生错误、503:服务器当前不能提供服务,一段时间后可恢复。

在了解完了HTTP协议的各大要素之后,我们来看看HTTP协议的具体工作的原理,或者说是流程是怎么样的呢?

HTTP工作原理(流程)

  HTTP采用的是请求/响应的模式,客户端向服务器发送一个请求报文(HTTP Request),在这个报文包含了请求行(请求方法、URL、版本号)、请求头部(host、user-agent、content-type、connection)、请求数据(可以没有,在post当中有,在get当中将请求数据写入了url当中)。服务器接受到请求以后,以一个HTTP Response进行响应,响应包括了状态行(版本号、状态码)、响应报头(date、content-type、)以及响应正文(请求的具体资源)。以下是具体的工作步骤:

1.客户端向服务器发起请求:HTTP客户端(通常是浏览器)与WEB服务器的HTTP端口(默认80)建立一个TCP套接字的连接。

2.发送HTTP请求:客户端通过tcp套接字向服务器发送一个HTTP Request

3.服务器响应请求:WEB服务器解析请求后,在服务器当中寻找到相应的要请求的资源,将资源装入HTTP Response,复写到TCP的套接字,由客户端读取。

4.释放TCP连接:若在HTTP Request当中的connection为close,则服务器主动关闭连接;若connection为keepalive,则连接保持一段时间,在该时间内可以继续接受请求。

5.客户端解析响应内容获取资源。

java网络通信:HTTP协议的更多相关文章

  1. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...

  2. Java实现SOAP协议 之 HelloWorld

    Java实现SOAP协议 之 HelloWorld SOAP是把基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起. 准备: 1. 准备一个web server.Tomcat 下载地址 h ...

  3. 《转》Java与Http协议

    引言 http(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式.HTTP协议的主要特点是:     1.支持客户/服务器模式.     2.简单快速:客户向 ...

  4. Java远程方法协议(JRMP)

    Java远程方法协议(英语:Java Remote Method Protocol,JRMP)是特定于Java技术的.用于查找和引用远程对象的协议.这是运行在Java远程方法调用(RMI)之下.TCP ...

  5. java网络通信:异步非阻塞I/O (NIO)

    转: java网络通信:异步非阻塞I/O (NIO) 首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的S ...

  6. java 网络通信传输层协议——UDP和TCP

    本文原文由作者“zskingking”发表于:jianshu.com/p/271b1c57bb0b,本次收录有改动. 1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯网专注的即时通 ...

  7. java网络通信:HTTP协议 之 Sessions与Cookies

    通过前一篇博客的讲解,我们大体知道了HTTP协议是什么,它有什么组成,以及它的工作原理,那么在HTTP的很多特点中,有一点叫做,无状态,就HTTP是一个无状态的协议,如果需要前面的信息用于处理后边的请 ...

  8. java网络通信:TCP协议

    面试的时候,面试官由于需要考察一个面试人对于网络编程的熟悉程度,往往会考察学生对于TCP.HTTP.UDP.这些常见的网络编程当中的协议的了解程度,而TCP协议则是首当其冲的,作为进程之间通信常用的一 ...

  9. Java 实现 SSH 协议的客户端登录认证方式--转载

    背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解.首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则,使得不同计算机之间 ...

随机推荐

  1. expect使用小结

    因为工作关系,需要经常从线上机器上拉取数据,于是想着能否写个脚本,自动完成这个任务呢? 我一般使用scp在机器间传输文件,然而每次scp都需要输入密码,自动化脚本怎么解决这个问题呢?于是expect这 ...

  2. mac os x之解决npm安装包失败,或者nodejs工程缺少依赖

    在国内做开发,由于各种各样的原因,导致网络总是那么不好,对于我们前端开发者,在使用npm的时候很可能因为网络问题导致包安装失败,然后我们又匆匆启动项目,导致缺少依赖等各种问题,下面将会介绍一个淘宝的n ...

  3. Android LayoutInflater深度解析

    1. 题外话 相信大家对LayoutInflate都不陌生,特别在ListView的Adapter的getView方法中基本都会出现,使用inflate方法去加载一个布局,用于ListView的每个I ...

  4. 应用Hash函数

    本文系转载,转自:http://www.blogjava.net/jinfei0627/articles/219543.html 应用Hash函数(java描述) 作者:冲处宇宙 时间:2007.1. ...

  5. 小米路由器设置DMZ主机 并在外网访问

    一.前提条件: 1.小米路由器 2.拥有公网IP的网络 二.步骤: 1.登陆小米路由器管理界面  miwifi.com 2.高级设置=>端口转发  页面底部的DMZ选项开启,然后选择需要映射到外 ...

  6. rem自适应js代码

    以后懒得写,直接复制了 var computedFz = (function(){ var designWidth = 375, rem2px = 100; function computedFz() ...

  7. 函数式编程--响应式编程 ---android应用例子

    RxJava implements this operator as create. It is good practice to check the observer’s isUnsubscribe ...

  8. Codeforces Round #411 (Div. 2) A-F

    比赛时候切了A-E,fst了A Standings第一页只有三个人挂了A题,而我就是其中之一,真™开心啊蛤蛤蛤 A. Fake NP time limit per test 1 second memo ...

  9. JS 本地属性与继承属性

    判断是否拥有某种属性 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); // --> true alert('toString' i ...

  10. 关于js闭包官方解释庖丁解牛式理解

    闭包:是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 变量+环境 首先按这个句子主谓宾来分解.闭包是一个表达式,通常是一个函数. 这意味着第一它 ...