----------------------------------客户端------------------------------------- http协议的客户端请求内容包括:请求行、消息头、内容,eg:GET /a.html HTTP/1.1 请求行:用于描述客户端的请求方式、请求的资源名称以及使用的http协议的版本号 消息头: Accept:用于告诉服务器,客户机支持的数据类型 Accept-Charset:用于告诉服务器,客户机采用的编码 Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式 Accept-Language:客户机的语言环境 Host:客户机通过这个头告诉服务器,想访问的主机名 If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间 Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链) User-Agent:客户机通过这个头告诉服务器,客户机的软件环境 Cookie:客户机通过这个头可以向服务器带数据 Range:指示服务器只传输一部分Web资源。这个头可以用来实现断点续传功能。Range字段可以通过三种格式设置要传输的 字段范围: Range:bytes=1000-2000,表示传输范围从1000到2000字节。 Range:bytes=1000-,表示传输Web资源中第1000个字节以后的所有内容。 Range:bytes=1000,传输最后1000个字节。 eg: /* 假设一个用户将一个文件下载了四个字符了,现在要接着上次没下载完的地方下载,编写客户端程序,从上次那个文件的第五个字符开始下载, 下载完毕后写入到D:\a.txt里面去,而且是接着a.txt上次的地方往下写,不是重新生成文件,代码如下: URL url = new URL("http://ip:port/projectname/a.txt"); HttpURLConnection con = (HttpURLConnection)url.openConnection(); con.setRequestProperty("range", "bytes=4-"); InputStream is = con.getInputStream(); FileOutputStream fos = new FileOutputStream("D:\\a.txt",true); byte[] buf = new byte[1024]; int len = 0; while((len=is.read(buf))>0){ fos.write(buf, 0, len); } */ 内容:一般post表单提交方式的话会把所有的内容放在这里面 --------------------------------------服务端------------------------------------------ http协议的服务端包括:状态行、响应头和内容,以下一一详细解释 状态行:用于描述服务器对请求的处理结果,eg:HTTP/1.1 200 OK 状态行常见的一些状态码: 100~199:表示成功接收请求,要求客户端继续提交下一个请求,才能完成整个处理过程 200~299:表示成功接收请求,并已完成整个处理过程,常用200 300~399:为完成请求,需要客户进一步细化需求。例如,请求的资源已经移动到一个新地址,常用302,307和304 >302表示要客户端去找别的地址,服务器会回送一个location给客户端,客户端会去找这个location,这个其实就是serlvet里面的重定向 >307和304表示要客户端去找缓存里面的数据 400~499:客户端的请求有错误,常用404 500~599:服务器端出现错误,常用500 响应头: Location:这个头配合302状态吗使用,用于告诉客户找谁 eg:response.setStatus(302); response.setHeader("location","页面地址"); Server:apache tomcat 服务器通过这个头,告诉浏览器服务器的类型 Content-Encoding:gzip 服务器通过这个头,告诉浏览器数据的压缩格式,一般都用gzip的压缩格式,Java提供了 GZIPInputStream类和GZIPOutputStream类以供压缩数据 Content-Length:服务器通过这个头,告诉浏览器回送数据的字节长度 Content-Type:text/html; chartset=GB2312 服务器通过这个头,告诉浏览器回送数据的类型 Last-Modified:Tue,11 Jul 2000 18:23:51 GMT 服务器通过这个头,告诉浏览器当前资源缓存时间 Refresh:服务器通过这个头,告诉浏览器隔多长时间刷新一次,该属性经常用在股票页面和聊天室 eg1:response.setHeader("refresh","3"); //3代表服务器告诉浏览器,每隔三秒钟刷新一次数据 eg2:response.setHeader("refresh","3;url='http://www.sina.com'");//每隔三秒刷新到新浪上去 Content-Disposition:服务器通过这个头,告诉浏览器以下载方式打开数据 eg:response.setHeader("Content-Disposition", "attachment;filename=下载时显示的文件名称"); /* InputStream is = this.getServletContext().getResourceAsStream("/yct_3.gif"); byte[] buf = new byte[1024]; int len = 0; OutputStream os = response.getOutputStream(); while((len=is.read(buf))>0){ os.write(buf,0,len); } */ Transfer-Encoding:chunked 服务器通过这个头告诉浏览器数据的传送格式,chunked代表一块块的传送 Set-Cookie:SS=QQ=5Lb_nQ; path=/search 设置cookie信息 ETag:缓存相关的头,相对于Last-Modified它能够做到实时更新 Expires:也是缓存相关的头,服务器通过它告诉浏览器,把回送的资源缓存多长时间,-1或0,则不缓存 Cache-Control:no-cache Pragma:no-cache 服务器通过以上两个头,也是控制浏览器不要缓存数据,控制浏览器不要缓存数据的属性之所以这么多,是 因为每个浏览器对数据的解析不一样,要想兼容性好一点,兼容的浏览器多一点,尽量都设置 Connection:close/Kep-Alive 告诉浏览器,响应完了是保存连接还是断开连接 Date:Tue, 11 Jul 2000 18:23:51 GMT 当前时间 Accept-Ranges:这个字段说明Web服务器是否支持Range属性,支持则返回Accept-Ranges:bytes,不支持 则返回Accept-Ranges:none. Content-Range:指定了返回的Web资源的字节范围,这个字段值的格式是:eg. Content-Range:1000-3000/5000 这句话的意思是我的资源一共有5000个字节,我向你返回1000-3000的字节范围 内容:一般是服务器返回给客户端的内容