您的位置:首页 > 理论基础 > 计算机网络

javaweb入门(3)-- 详细了解http协议1

2013-03-22 20:53 351 查看
http协议:超文本传送协议
http协议用于定义客户端与web服务器进行通讯的格式 ,换一种说法就是:用两人约定好话来交流。
http协议是tcp/ip的应用层协议。

学习javaEE,务必要深刻了解http协议,对以后的web开发起着巨大的作用,而且在以后的学习中,还可以对javaEE所封装的一些方法一点就通,所以掌握了http协议,是再基础不过的要求。

当我们使用浏览器访问某个网站时,浏览器是如何从web服务器那获得数据并显示给用户呢?其实,当我们去访问某个web资源时,浏览器会发送一个http请求到web服务器,而web服务器收到http请求之后,会读取相关的资源,并且反回一个http响应将数据传递给浏览器。下面,就来详细了解一下http协议的http请求与http响应。

通过httpwatch工具,获取浏览器访问百度时http请求的数据:
GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; KB974487)
Accept-Encoding: gzip, deflate
Host: www.baidu.com
Connection: Keep-Alive
上述为一个Http请求:

GET / HTTP/1.1 代表一个请求头,GET为请求方式, / 是请求的资源路径 HTTP/1.1是协议的版本

Accept: text/html.....
......
Connection:keep-Alive 中间这一段代表多个请求行,请求行中包含着要请求的主机名,支持的压缩格式等等。
一个空行(空行也是数据的一部分)
请求的实体数据(当有数据要交给web服务器时)

了解了HTTP协议的格式,我们可以尝试依照这样的格式,用最最简单的方式来访问一个web资源。
import java.io.*;
import java.net.*;
public class HttpTest{
public static void main(String args[]) throws Exception{
//连接百度服务器
InetAddress inet = InetAddress.getByName("www.baidu.com");
Socket s = new Socket(inet, 80);

//获取输出流,并输出HTTP协议
OutputStream out = s.getOutputStream();

out.write("GET / HTTP/1.1\r\n".getBytes());	         //请求头
out.write("Host: www.baidu.com\r\n".getBytes());     //请求行
out.write("Connection:close\r\n".getBytes());
out.write("\r\n".getBytes());                        //一个空行,必须的
out.write("\r\n".getBytes());
out.flush();

//用输入流接收百度服务器返回的数据,写到html文件中。
InputStream in = s.getInputStream();
FileOutputStream outt = new FileOutputStream(new File("D:\\baidu.html"));

byte[] buf = new byte[1024];
int len =0;
while((len=in.read(buf))!=-1){
outt.write(buf, 0, len);
}
System.out.println("OK");
}
}


编译运行上面的java类之后,到D盘打开输出文件baidu.html,打开之后可以发现,我们也可以拿到百度服务器所传递给我们的数据。
如下图:



从上图又可以看出,有一部分内容与我们平时看到的页面有所不同,页面中多了一些信息:
HTTP/1.1 200 OK Date: Fri, 22 Mar 2013 12:33:50 GMT Server: BWS/1.0 Content-Length: 10299 Content-Type:
text/html;charset=utf-8 Cache-Control: private Expires: Fri, 22 Mar 2013 12:33:50 GMT Set-Cookie: H_PS_PSSID=2071_2098_1442_1945_1788; path=/; domain=.baidu.com Set-Cookie: BAIDUID=158B13884EC5E243393D01AF6C80A5A8:FG=1; expires=Fri, 22-Mar-43 12:33:50 GMT;
path=/; domain=.baidu.com P3P: CP=" OTI DSP COR IVA OUR IND COM " Connection: Close

这些又是什么呢?又为什么会出现呢?
这些信息,其实就是http响应,通过http响应,服务器就可以告知浏览器,服务器的基本信息以及浏览器要如何处理这些数据。
通常浏览器获得服务器的http响应之后,浏览器解析这些数据之后显示给用户正常的网页页面,而刚才我们是将所有数据直接写到baidu.html文件当中,所以页面上会多了这些信息。

HTTP响应:
格式:

HTTP/1.1 200 OK 这是一个状态行
Content-Length:10299
......
Content-Type:text/html;charset=utf-8 这些是多个消息头
一个空行(也是数据的一部分)
实体内容。

通过上述的例子,可以基本了解http请求与http响应,至于http协议常用的请求行与消息头,请听下回分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: