HTTP - 串行连接(keep-alive)、持久连接、管道化持久连接
手动通过 io 写http请求,遇到(以下)参数。细查以下,重新认识http连接类型。
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连接时延,以及管道化请求是如何消除传输时延的。
其他
其他httpClient设置:
setinstancefollowredirects
设置此 httpurlconnection
实例是否应该自动执行 http
重定向(响应代码为 3xx
的请求)。
默认值来自 followredirects
,其默认情况下为 true
。
HttpUrlConnection的setDoOutput与setDoInput
-
httpUrlConnection.setDoOutput(false);
以后就可以使用conn.getOutputStream().write()
-
httpUrlConnection.setDoInput(true);
以后就可以使用conn.getInputStream().read();
-
get
请求用不到conn.getOutputStream()
,因为参数直接追加在地址后面,因此默认是false。 -
post
请求(比如:文件上传)需要往服务区传输大量的数据,这些数据是放在http
的body
里面的,因此需要在建立连接以后,往服务端写数据。
因为总是使用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的。