2014-09-24 75 views
3

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;这是从连接超时还是套接字超时?我怀疑这是后者,尤其是因为信息中显示“Read timed out”。连接超时会引发什么异常? TimeoutExceptionConnectException?为什么在Apache Http Docs中捕获的超时设置和抛出的异常之间没有关系?

SocketTimeoutException的直接父类为InterruptedIoExceptionIOException;前者只有SocketTimeoutException作为子类,但IOException有许多子类。是否有另一个参考涵盖了所有可以从HttpClient execute方法中获得的异常?它只声明它可以抛出一个IOException,这真的很宽泛。

回答

2

我从来没有经历过的Java API类之间的关系,但我认为你需要的是

  1. java.net.ConnectException:数据包丢失,由于错误的网络,网络过载,太多请求到服务器,防火墙。

  2. java.net.SocketTimeoutException:套接字超时是在数据传回给调用者时保持服务器套接字打开的时间量。这甚至可能是服务器仍然在处理和写回数据,但它需要相当长的时间,客户端已经超时等待它。