有没有办法区分连接超时和套接字超时?
Posted
技术标签:
【中文标题】有没有办法区分连接超时和套接字超时?【英文标题】:Is there any way to distinguish a connection timeout from a socket timeout? 【发布时间】:2014-11-19 05:59:57 【问题描述】:Apache HttpClient 框架允许您指定连接超时和套接字超时,如下所示:
final HttpParams httpParams = new BasicHttpParams();
if (connectionTimeout > 0)
HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeout);
if (socketTimeout > 0)
HttpConnectionParams.setSoTimeout(httpParams, socketTimeout);
HttpClient client = new DefaultHttpClient(httpParams);
我想微调我的连接超时。 This question 很好地解释了设置之间的区别,但对调试抛出的异常没有帮助。
我的问题是,每种超时都会引发什么异常?我有一个java.net.SocketTimeoutException
;这是来自连接超时还是套接字超时?我怀疑是后者,特别是因为消息说“读取超时”。连接超时会抛出什么异常? TimeoutException
? ConnectException
?为什么Apache Http Docs 中没有捕捉到超时设置和抛出异常之间的关系?
SocketTimeoutException
的直接父类是InterruptedIoException
和IOException
;前者只有SocketTimeoutException
的子类,但IOException
有很多子类。是否有另一个参考资料涵盖了人们可以期望从 HttpClient execute
方法接收到的所有异常类型?它只是声明它可以抛出一个IOException
,这真的很广泛。
【问题讨论】:
【参考方案1】:Java API 中类之间的关系我还没有仔细研究过,但我认为你需要的是
java.net.ConnectException : 由于网络错误、网络过载、对服务器的请求过多、防火墙导致丢包。
java.net.SocketTimeoutException :套接字超时是在将数据传输回调用方时保持服务器套接字打开的时间量。这甚至可能是服务器仍在处理和写回数据,但花费了相当长的时间,而客户端刚刚超时等待它。
【讨论】:
以上是关于有没有办法区分连接超时和套接字超时?的主要内容,如果未能解决你的问题,请参考以下文章