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

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 的直接父类是InterruptedIoExceptionIOException;前者只有SocketTimeoutException 的子类,但IOException 有很多子类。是否有另一个参考资料涵盖了人们可以期望从 HttpClient execute 方法接收到的所有异常类型?它只是声明它可以抛出一个IOException,这真的很广泛。

【问题讨论】:

【参考方案1】:

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

    java.net.ConnectException : 由于网络错误、网络过载、对服务器的请求过多、防火墙导致丢包。

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

【讨论】:

以上是关于有没有办法区分连接超时和套接字超时?的主要内容,如果未能解决你的问题,请参考以下文章

如何为默认的swagger android客户端设置连接和套接字超时

java网络编程

如何区分 curl 最大时间和连接超时?

nodejd tcp超时时间设置

如何在 boost asio 中设置阻塞套接字的超时时间?

Qt:QTcpSocket 的默认连接超时