java setsotimeout_HttpClient超时设置setConnectionTimeout和setSoTimeout
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相关推荐
- java-commons-HttpClient超时设置setConnectionTimeout和setSoTimeout
问题 之前使用httpclient请求数据 源码方法: public static String doHttp(HttpMethod result, int timeout, String chars ...
- java接口超时设置_java接口请求超时处理方法
//********* // 成员内部类 class CallableThread implements Callable { @Override public Result call() { try ...
- java jdbc超时设置_java – 为JDBC连接设置网络超时
我正在尝试使用 Java设置网络超时我的Oracle数据库连接.但是,我收到了一个错误.下面是示例代码,它是相应的例外. try{ conn = new Database("oracle&q ...
- java webservice超时设置_[CXF]Spring下设置CXF的WebService客户端超时时长
评论 # re: [CXF]Spring下设置CXF的WebService客户端超时时长 2010-01-05 21:47 Emily32Av A kind of good information a ...
- java 设置超时_java线程超时设置方法
对于java中线程超时间可以使用ExecutorService与Timer来控制一个线程什么时候超时了,下面我整理了一些方法,这些文章都详细的介绍java线程超时设置技巧. 方法一 本例子使用Exec ...
- java rmi接口 超时设置_Spring RMI客户端读超时设置 | 学步园
标准Java的RMI设置我所知道的有三种方式,其中第1.2种不区分框架均适用,但影响整个JVM级别的RMI服务 1. 启动时设置sun.rmi.transport.tcp.responseTimeou ...
- java selenium一一等待超时设置
java selenium一一超时设置 前言 1.显式等待 2.隐式等待 3.流利等待 前言 在使用selenium中我们遇到了,有时候一个点击查询或者其它操作需要加载等待很长的时间,我的程序就会等待 ...
- 深入理解JDBC的超时设置 转
转 http://www.admin10000.com/document/1360.html 恰当的JDBC超时设置能够有效地减少服务失效的时间.本文将对数据库的各种超时设置及其设置方法做介绍. 真实 ...
- httpwebrequest超时时间timeout设置无效_【SpringBoot WEB 系列】RestTemplate 之超时设置...
[SpringBoot WEB 系列]RestTemplate 之超时设置 一般来讲我们访问外部资源时,需要做一个保护,比如最常见的添加一个超时设置,避免一直被阻塞,RestTemplate 可以通过 ...
最新文章
- 用Python发一个高逼格的朋友圈
- 国产半导体路在何方,瓦森纳与光刻机你了解多少
- 【BZOJ】1823: [JSOI2010]满汉全席(2-sat)
- saltstack批量修改root密码
- .NET6之MiniAPI(十):基于策略的身份验证和授权
- 利用SVN的post-commit钩子实现多项目自动同步
- VS系列IDE(2005、2008等)下使用cppunit的方法及使用示例
- 东北大学计算机期末考试题,东北大学计算机组成原理题库(10)
- IOS KVO与NSNotificationCenter简单使用
- 单张滑动tab 组件
- 【基础教程】基于matlab疫情防护动图制作【含Matlab源码 028期】
- html实现验证码效果,html5使用canva实现验证码效果(代码实例)
- Host是什么?Host的含义和作用【转载】
- win7计算机自动关机设置在哪里设置方法,win7系统怎么设置自动关机
- Python中的爬虫
- 李宏毅 Transformer(Decoder部分)
- Java零基础学习记录09(飞机躲避炮弹游戏实现)
- DbContext 查询(二)
- 超好玩的模拟游戏:美国卡车模拟Mac中文版
- compareto返回1和-1的区别_温故篇:Comparable与Compatator的区别
热门文章
- java里用set写自我介绍代码_【优质】java程序员自我介绍-优秀word范文 (8页)
- 你知道Salesforce,但你知道Intuit吗?
- 5个很热门的计算机视觉应用及相关数据集!
- java调用视图如何传参_Spring MVC中 视图 向 控制器 传参(接收方式)
- 【Unity实战100例】Unity循环UI界面切换卡片功能
- pcb - 如果回流焊温度曲线选错了, 可以重新选回流焊温度曲线, 重新进炉子
- android hotseat自动排列,Hotseat 自动排列(基于AndroidO版本实现iPhone居中效果)
- 听得见炮声的软件开发
- 类与对象(中) 构造函数和析构函数
- 【译】MySQL挑战:建立10万连接