HTTP - 串行连接(keep-alive)、持久连接、管道化持久连接

手动通过 io 写http请求,遇到(以下)参数。细查以下,重新认识http连接类型。
HTTP - 串行连接(keep-alive)、持久连接、管道化持久连接


HTTP/1.0+ keep-alive连接

  • 在很多情况下,服务器真正“处理”事务的时间并不长。绝大部分时间都被消耗在了建立TCP连接、传输请求和响应报文上
    当客户端请求的资源在一台服务器上,请求被串联执行时,这种时延将会被进一步放大。
    效率低
  • 在HTTP/1.0的各种增强版本中,通讯双方默认是不使用持久化连接的。
    当客户端请求中含有Connection: Keep-Alive首部,服务器响应中也有Connection: Keep-Alive首部时,双方才会成功建立持久连接

HTTP/1.1持久连接

HTTP/1.1在废弃Keep-Alive后,提出了一种持久连接(persistent connection)的改进型设计取代它。

持久连接在默认情况下都是支持的。除非特别指明,否则HTTP/1.1假定所有连接都是持久的。如果客户端需要事务处理完之后直接关闭TCP连接,需要显式地添加一个Connection: close首部。同样如果服务器返回的首部中没有Connection: close首部,客户端会认为连接仍维持在打开状态。

管道化连接

HTTP/1.1允许在持久连接上可选地使用请求管道。
在响应到达之前,可以将多余请求放入队列。下图显示了持久化连接是怎样消除TCP连接时延,以及管道化请求是如何消除传输时延的。

HTTP - 串行连接(keep-alive)、持久连接、管道化持久连接


其他


其他httpClient设置:

setinstancefollowredirects

设置此 httpurlconnection 实例是否应该自动执行 http 重定向(响应代码为 3xx 的请求)。
默认值来自 followredirects,其默认情况下为 true

HttpUrlConnection的setDoOutput与setDoInput

  • HttpUrlConnection的setDoOutput与setDoInput的区别

  • httpUrlConnection.setDoOutput(false); 以后就可以使用conn.getOutputStream().write()

  • httpUrlConnection.setDoInput(true);以后就可以使用conn.getInputStream().read();

  • get 请求用不到 conn.getOutputStream(),因为参数直接追加在地址后面,因此默认是false。

  • post请求(比如:文件上传)需要往服务区传输大量的数据,这些数据是放在httpbody里面的,因此需要在建立连接以后,往服务端写数据。
    因为总是使用conn.getInputStream()获取服务端的响应,因此默认值是true

  • public void setDoInput(boolean doinput)将此 URLConnection 的 doInput 字段的值设置为指定的值。
    URL 连接可用于输入和/或输出。
    如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;
    如果不打算使用,则设置为 false。默认值为 true。

  • public void setDoOutput(boolean dooutput)将此 URLConnection 的 doOutput 字段的值设置为指定的值。
    URL 连接可用于输入和/或输出。
    如果打算使用 URL 连接进行输出,则将 DoOutput 标志设置为 true;
    如果不打算使用,则设置为 false。默认值为 false。

简单一句话:get请求的话默认就行了,post请求需要setDoOutput(true),这个默认是false的。