HTTP协议
通讯格式
请求和响应都是一堆数据,客户端和服务端会按照格式解析
src、href会发请求
HTTP格式
3部分
一个请求行
多个请求头
一个请求体
请求行
- 请求方式
- 请求的资源路径(URL路径后段)
- 版本号
请求头
- 请求的服务器地址
- 浏览器的信息(编码,语言。。)
GET请求
- url带数据,限制1K内
请求头
- 请求头:
- 都是告诉服务端客户端的信息
- Host:服务器主机和短裤
- Accept,客户端支持接收什么数据(什么都接收/图片/网页)
- Accept-Charset:客户端支持的编码(常见都支持),客户端用支持的编码形式解码,即告诉服务端用什么形式编码。对应,服务端响应也会告诉客户端用什么格式解码
- Accept-Encoding:支持的压缩格式
- Accept-Language:客户端的语言环境,不同国家不同语言页面
- If-modified-since:资源缓存的时间戳,服务器拿这个时间和资源最后一次更新时间对比,时间一样叫客户端去拿缓存。不一样就返回最新资源,相当于版本号
- referer:防盗链,告诉服务器是从哪个客户端访问过来的(url,包含主机和端口)
- User-Agent:浏览器软件信息,哪个软件,什么版本
- Connection:Keep-Alive ,服务器请求完后是保持链接还是关闭
- Cookie:通过这个头向服务器带数据,存再浏览器中
响应头
3部分
- 状态行:3部分–>协议版本,状态码,状态描述msg
- 消息头:KV,描述服务器和数据信息,告诉客户端怎么处理,可以控制浏览器处理数据的行为(如:直接打开图片还是附件形式下载)
- 实体内容:
响应头:- 告诉浏览器,浏览器有多种,所以响应头会多点,有些头只在部分浏览器起作用,最好都加上,兼容问题
- Location:300转发时要请求什么链接
- 服务器的信息:阿帕奇tomcat
- Content-Encoding:压缩格式,服务器返回的数据压缩了快,指定后浏览器获取数据自动解压
- Content-Length:返回数据长度
- Content-Language:浏览器最好用什么语言解析
- Content-Type:返回的数据类型,服务器返回的都是bit,显示成什么靠类型,application/xml。。
- Last-Modified:告诉客户端资源的最后修改时间
- Refresh:通知浏览器多久刷新一次
- content-disposition:以下载方式打开数据
- Tranfer-Encoding:数据传送形式
- set-Cookie:设置Cookie
- Etag:缓存相关,每个资源生成一个标识符,资源变化了标识符页也变,影响缓存
- Exprise:资源缓存时间多久,-1或0不缓存,这段时间内不向服务器拿数据,去拿浏览器缓存
- Cache-Cotroller:no-cache ,也是控制缓存的
- Prama:no-cache,控制缓存
- Range:实现断点下载
数据压缩
IO流
掌握3点
- 操作字符还是字节
- 输入还是输出
- 作用的场景是什么(文件,缓冲。。)
重点流
- 文件流
- 缓冲流
- 转换流
- 对象流
手动断开流
不要throws IO异常,内存泄漏
内存泄露和溢出
- 内存泄漏:由于某种原因,没有使用的实例对象不能被GC回收,那部分内存没有使用也不能被使用,相当于泄露掉了(比如:物理链接没有关闭)
- 内存溢出:内存泄漏多了会导致内存不足,再使用就不够,你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,出现溢出。
读取字节的优化–> 读一个字节写一个,改为读了一个字节数组再写
读到字节:读多少取多少,声明len
字节流传输字符不能在内存层面取读,不完整,传输完后大部分软件都会帮忙编解码
缓冲流:包装流,在4个基础实现流上包装(提升效率)
形式:new BufferedInputStream(new FileInputStream());
读写的时候用缓冲流的read(),write()
关闭流:先关包装流,再关其他流(关闭包装流的时候帮你做了)
缓冲的实现,相当于数组的优化,给你一个默认8个字节的数组当缓冲区
缓冲区:满了就刷出,缓冲流有write()自动帮你完成(其他包装流不一定有,要手动)
//方式二:使用String
String data;
while((data = br.readLine()) != null){
//方法一:
// bw.write(data + "\n");//data中不包含换行符
//方法二:
bw.write(data);//data中不包含换行符
bw.newLine();//提供换行的操作
}
编码
- 都是用10进制编码(最后底层是二进制)
其他编码都兼容ASCII,一个字节表示字母
unicode两个字节是两个ASCLL的字母还是一个字呢,开头0/1表示,少了一位,而且很多一个字节就能表示的都用两个字节,浪费
UTF-8
变长的编码方式,基本的所有字符1-4个字符表示(中文3个字符表示)
最新修正可以扩展到6个字符