http是基于TCP/IP进行通信的,tcp通过3次握手建立连接,并最终以4次挥手终止通信。

知乎上对三次握手和四次挥手有如下解释:

作者:知乎用户

链接:https://www.zhihu.com/question/67772889/answer/256760079

来源:知乎

http是应用层协议,主要依赖于运输层TCP协议(HTTP协议没有规定具体使用哪个运输层协议)。

tcp连接建立和断开方式涉及到客户端和服务器端的端口,缓存等资源的分配与释放问题。

建立连接时,主动连接方(客户端)向服务器请求建立连接(SYN),服务器端收到后会给客户端响应(ack),表示它这边准备好连接了,但是他要确保客户端收到了它的响应,于是需要第三个数据包 客户端向服务器端确认(ack),这样相互确认之后服务器端就可以给这条连接分配必要的端口、缓存等资源。 假设只有两次数据包交换就分配资源,若服务器端响应客户端连接请求的包丢失了,客户端会认为服务器未响应,放弃本次连接请求,而服务器端之前分配的资源就会被闲置浪费。 更多次的报文交换是可以的,但是完全没有必要。 三次交换是建立连接所需最少的数量。

断开连接时, 任务先完成的一方(这里假设是客户端)会向另一方(即服务端)发送断开请求(FIN),表示自己这一方传输任务已经完成,服务器端收到后会响应。 但是这里 服务器端传送给客户端的数据可能还没有完,他需要维持当前连接来完成剩余的传输任务,即客户端还不能释放当前连接所需的资源。当服务端数据传输任务完成后,他会向客户端发送断开请求(FIN),客户端响应。 这样双方相互确认数据传输完成,可以断开连接,分别释放当前连接占用的系统资源,而不是提前释放导致传输的数据丢失。

TCP三次握手

TCP四次挥手

httpConnection有两个重要的属性:http.connection.timeout和http.socket.timeout。connection timeout是建立连接的超时时间,socket timeout表示的是等待服务端响应数据的超时时间。

SocketTimeoutException 和 ConnectTimeoutException 均派生自 InterruptedIOException(IO被中断异常、IO被阻断异常)

commons-httpclient 3.1里HttpConnectionParams.java里有如下2个方法:

/*** Sets the timeout until a connection is etablished. A value of zero

* means the timeout is not used. The default value is zero.

*

*@paramtimeout Timeout in milliseconds.*/

public void setConnectionTimeout(inttimeout) {

setIntParameter(CONNECTION_TIMEOUT, timeout);

}/*** Sets the default socket timeout (SO_TIMEOUT) in milliseconds which is the

* timeout for waiting for data. A timeout value of zero is interpreted as an infinite

* timeout. This value is used when no socket timeout is set in the

* {@linkHttpMethodParams HTTP method parameters}.

*

*@paramtimeout Timeout in milliseconds*/

public void setSoTimeout(inttimeout) {

setIntParameter(SO_TIMEOUT, timeout);

}

如下示例代码,可以模拟ConnectTimeoutException和SocketTimeoutException

importorg.apache.commons.httpclient.HttpClient;importorg.apache.commons.httpclient.HttpException;importorg.apache.commons.httpclient.HttpMethod;importorg.apache.commons.httpclient.methods.GetMethod;importjava.io.IOException;public classHttpclientTimeoutTest {public static voidmain(String[] args) {

HttpClient client= newHttpClient();

HttpMethod method= new GetMethod("https://linkedin.com/company/stack-overflow");

client.getHttpConnectionManager().getParams().setConnectionTimeout(10);

client.getHttpConnectionManager().getParams().setSoTimeout(1000);

System.out.println("begin..");long start =System.currentTimeMillis();try{int statusCode =client.executeMethod(method);

System.out.println(statusCode);byte[] responseBody = null;

responseBody=method.getResponseBody();

String result= newString(responseBody);

System.out.println(result);

}catch(HttpException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{

System.out.println("end..Duration MS:" + (System.currentTimeMillis() -start));

}

}

}

这里,将建立连接的超时时间设置为小到10ms。即可复现出来ConnectTimeoutException---connect timed out。

begin..

org.apache.commons.httpclient.ConnectTimeoutException: The host did not accept the connection within timeout of 10 ms

at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:155)

at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:130)

at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)

at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)

at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)

at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)

at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)

at com.emax.paycenter.HttpclientTimeoutTest.main(HttpclientTimeoutTest.java:24)

Caused by: java.net.SocketTimeoutException: connect timed out

at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)

at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)

at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)

at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)

at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

at java.net.Socket.connect(Socket.java:579)

at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:618)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)

... 7 more

end..Duration MS: 1064

View Code

将读取数据的响应超时时间设置为小到10ms,即可复现出来SocketTimeoutException---Read timed out。

begin..

java.net.SocketTimeoutException: Read timed out

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(SocketInputStream.java:152)

at java.net.SocketInputStream.read(SocketInputStream.java:122)

at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)

at sun.security.ssl.InputRecord.read(InputRecord.java:480)

at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)

at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)

at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702)

at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)

at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)

at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)

at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828)

at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2116)

at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)

at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)

at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)

at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)

at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)

at com.emax.paycenter.HttpclientTimeoutTest.main(HttpclientTimeoutTest.java:25)

end..Duration MS: 1516

View Code

具体应用中,需要以实际需要来做超时设置。

references:

文中分析了httpclient3.*的一些漏洞。推荐使用httpclient4.2.3。1. 将connection请求头设置为close,则会关闭连接socket。(如果是keep-alive ,不会关闭);2、在使用httpclient3.1时(4.2.3没问题),尽量不要调用 byte[] getResponseBody() :因为如果Content-Length没设置或者传输的数据大于1M,会有大量冗余日志。

分析了TCP为什么需要3次握手,和为什么需要4次挥手

java setsotimeout_HttpClient超时设置setConnectionTimeout和setSoTimeout相关推荐

  1. java-commons-HttpClient超时设置setConnectionTimeout和setSoTimeout

    问题 之前使用httpclient请求数据 源码方法: public static String doHttp(HttpMethod result, int timeout, String chars ...

  2. java接口超时设置_java接口请求超时处理方法

    //********* // 成员内部类 class CallableThread implements Callable { @Override public Result call() { try ...

  3. java jdbc超时设置_java – 为JDBC连接设置网络超时

    我正在尝试使用 Java设置网络超时我的Oracle数据库连接.但是,我收到了一个错误.下面是示例代码,它是相应的例外. try{ conn = new Database("oracle&q ...

  4. java webservice超时设置_[CXF]Spring下设置CXF的WebService客户端超时时长

    评论 # re: [CXF]Spring下设置CXF的WebService客户端超时时长 2010-01-05 21:47 Emily32Av A kind of good information a ...

  5. java 设置超时_java线程超时设置方法

    对于java中线程超时间可以使用ExecutorService与Timer来控制一个线程什么时候超时了,下面我整理了一些方法,这些文章都详细的介绍java线程超时设置技巧. 方法一 本例子使用Exec ...

  6. java rmi接口 超时设置_Spring RMI客户端读超时设置 | 学步园

    标准Java的RMI设置我所知道的有三种方式,其中第1.2种不区分框架均适用,但影响整个JVM级别的RMI服务 1. 启动时设置sun.rmi.transport.tcp.responseTimeou ...

  7. java selenium一一等待超时设置

    java selenium一一超时设置 前言 1.显式等待 2.隐式等待 3.流利等待 前言 在使用selenium中我们遇到了,有时候一个点击查询或者其它操作需要加载等待很长的时间,我的程序就会等待 ...

  8. 深入理解JDBC的超时设置 转

    转 http://www.admin10000.com/document/1360.html 恰当的JDBC超时设置能够有效地减少服务失效的时间.本文将对数据库的各种超时设置及其设置方法做介绍. 真实 ...

  9. httpwebrequest超时时间timeout设置无效_【SpringBoot WEB 系列】RestTemplate 之超时设置...

    [SpringBoot WEB 系列]RestTemplate 之超时设置 一般来讲我们访问外部资源时,需要做一个保护,比如最常见的添加一个超时设置,避免一直被阻塞,RestTemplate 可以通过 ...

最新文章

  1. 用Python发一个高逼格的朋友圈
  2. 国产半导体路在何方,瓦森纳与光刻机你了解多少
  3. 【BZOJ】1823: [JSOI2010]满汉全席(2-sat)
  4. saltstack批量修改root密码
  5. .NET6之MiniAPI(十):基于策略的身份验证和授权
  6. 利用SVN的post-commit钩子实现多项目自动同步
  7. VS系列IDE(2005、2008等)下使用cppunit的方法及使用示例
  8. 东北大学计算机期末考试题,东北大学计算机组成原理题库(10)
  9. IOS KVO与NSNotificationCenter简单使用
  10. 单张滑动tab 组件
  11. 【基础教程】基于matlab疫情防护动图制作【含Matlab源码 028期】
  12. html实现验证码效果,html5使用canva实现验证码效果(代码实例)
  13. Host是什么?Host的含义和作用【转载】
  14. win7计算机自动关机设置在哪里设置方法,win7系统怎么设置自动关机
  15. Python中的爬虫
  16. 李宏毅 Transformer(Decoder部分)
  17. Java零基础学习记录09(飞机躲避炮弹游戏实现)
  18. DbContext 查询(二)
  19. 超好玩的模拟游戏:美国卡车模拟Mac中文版
  20. compareto返回1和-1的区别_温故篇:Comparable与Compatator的区别

热门文章

  1. java里用set写自我介绍代码_【优质】java程序员自我介绍-优秀word范文 (8页)
  2. 你知道Salesforce,但你知道Intuit吗?
  3. 5个很热门的计算机视觉应用及相关数据集!
  4. java调用视图如何传参_Spring MVC中 视图 向 控制器 传参(接收方式)
  5. 【Unity实战100例】Unity循环UI界面切换卡片功能
  6. pcb - 如果回流焊温度曲线选错了, 可以重新选回流焊温度曲线, 重新进炉子
  7. android hotseat自动排列,Hotseat 自动排列(基于AndroidO版本实现iPhone居中效果)
  8. 听得见炮声的软件开发
  9. 类与对象(中) 构造函数和析构函数
  10. 【译】MySQL挑战:建立10万连接