connect timed out 和 socket timeout

6,819 阅读2分钟

设置连接超时和读取超时方法举例

例一

 HttpGet hg = new HttpGet("http://www.youtube.com");
 hg.setConfig(RequestConfig.custom().setConnectTimeout(1).setSocketTimeout(5000).build()); 
 HttpClients.createDefault().execute(hg);

此时 setConnectTimeout(1),所以在连接时可能会因为网速等原因爆异常:

Exception in thread "main" org.apache.http.conn.ConnectTimeoutException:  Connect to www.youtube.com:80 [www.youtube.com/74.86.3.208] timed out
...	

例二

 HttpGet hg = new HttpGet("http://www.youtube.com");
 hg.setConfig(RequestConfig.custom().setConnectTimeout(1000).setSocketTimeout(1).build());
 CloseableHttpResponse ch = HttpClients.createDefault().execute(hg);

此时 setSocketTimeout(1) ,所以在连接时可能会因为目标服务器本身的数据库慢,会爆异常

Exception in thread "main" java.net.SocketTimeoutException: Read timed out
...

connection timeout

connection timeout 是建立连接的超时时间,所谓连接的时间是从 HttpClient 发送请求的地方开始到连接上目标 url 主机地址的时间。

理论上是距离越短越快,线路越通畅越快,但是由于路由复杂交错,往往连接上的时间都不固定,运气不好连不上。

HttpClient 有默认连接时间,假如超过默认连接时间过一会继续尝试连接,这样会有一个问题 假如遇到一个 url 老是连不上,会影响其他线程的线程进去。

所以我们有必要进行特殊设置,比如设置 10 秒钟 假如 10 秒钟没有连接上我们就报异常,这样我们就可以进行业务上的处理,比如我们业务上控制 过会再连接试试看。并且这个特殊 url 写到 log4j 日志里去。方便管理员查看。

socket timeout

socket timeout 是 HttpClient 已经连接到了目标服务器,等待服务端响应数据的超时时间,一般情况读取数据都是很快速的。

但是假如读取的数据量大,或者是目标服务器本身的问题(比如读取数据库慢,并发量大等...)也会影响读取时间。

我们还是需要来特殊设置下,比如设置 10 秒钟假如 10 秒钟还没读取完就报异常,同上,我们可以业务上处理。