有没有办法区分连接超时和套接字超时?

时间:2014-09-24 16:31:42

标签: java sockets connection timeout apache-httpclient-4.x

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 time out out"。连接超时会抛出什么异常? TimeoutExceptionConnectException?为什么不在Apache Http Docs中捕获的超时设置和异常之间的关系?

SocketTimeoutException的直接父类是InterruptedIoExceptionIOException;前者对于子类只有SocketTimeoutException,但IOException有许多子类。是否有另一个参考文献涵盖了HttpClient execute方法可以获得的所有异常风格?它只声明它可以抛出IOException,这真的非常广泛。

1 个答案:

答案 0 :(得分:3)

我还没有通过Java API中的类之间的关系,但我认为你需要的是

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

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