1,HTTP介绍:
http :超文本传输协议
http的特点:
[1]基本tcp协议 osi(open System Interconnect)开放式系统互联 定义网络模型 物理层 网络链路层 网络层 传输层 会话层 表示层 应用层
a,tcp 三次请求 (三次握手 )
b,tcp 默认端口是80
c,http属于应用层
[2]基本请求和响应 必须先有请求 在有响应
2,httpwatch 抓包工具 (必须在32位IE游览器使用)
1)get请求
请求行:第一行
请求头:非第一行
2)post请求
请求行:第一行
请求头:非第一行
请求体:请求头的下面 文本的方式
特点:安全 数据没有大小限制
accept:客户端可以接收的类型
referer:请求的地址
accept-language:语言
user-agent:浏览器标识
accept-encoding: 客户端支持的数据压缩格式
host:访问的主机
Conetent-length:请求体的长度
DNT:1 不允许追踪
connection:kepp-alive 请求服务器后,保持连接,还是失去连接
cache-control:no-cache 不缓存
响应行
响应头
响应体
分段流 :电视直播 1-1000不会卡顿
3,常见的响应状态码:
100~199 Informational 请求信息不足 ,还需要其他信息才能处理
200~299 Success 请求处理成功
300~399 Redirection 服务器已经处理完毕,客户端还需要进一步动作
400~499 Client Error 客户端错误 URL写错了
500~599 Server Error 服务器端错误 tomcat挂掉了
200 代表请求成功
302 代表重定向
304 找本地缓存
404 访问资源不存在
500 服务器内部错误
响应头:
accept-ranges:bytes 范围
last-modifyed:最后一次修改的时间
chrome 右键 检查
4,Range头访问服务器下载问题
【1】Range介绍
作用:对文件进行分段下载
原理:
固定使用方法:
connection.setRequestProperty("Range", "bytes=1000-"); 从1001个字节开始下载,0-1000 不会下载
connection.setRequestProperty("Range", "bytes=0-99"); 从0字节起,下载到100个字节
【2】Demo 测试:
a,在 Tomcat\apache-tomcat-7.0.65\webapps\qq 中 添加要下载的文件。
b,创建url 获取到文件进行IO流下载
package com.heima.range;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class Range {
public static void main(String[] args) {
try {
// [1]准备一个URL路径
URL url = new URL("http://localhost:8080/qq/aa.txt");
// [2]发送这个请求
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// [2.1]添加一个请求头固定写法
connection.setRequestProperty("Range", "bytes=1000-");
// [3]接收服务端响应 接收响应码
int responseCode = connection.getResponseCode();
if (responseCode == 206) {
// 请求成功了 206是Tomcat接受成功对应响应码
// [4]接收服务端的内容 只要有流 那么就流对接
InputStream stream = connection.getInputStream();
FileOutputStream fops = new FileOutputStream("bb.txt");
int len = 0;
byte[] buffer = new byte[1024];
while ((len = stream.read(buffer)) != -1) {
fops.write(buffer, 0, len);
}
stream.close();
fops.close();
System.out.println("下载完成");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}