RYN*_*RYN 5 java timeout urlconnection httpclient
我正在使用HttpClient阅读网页,如下所示:
httpclient = new DefaultHttpClient();
httpget = new HttpGet("http://google.com");
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream PIS = entity.getContent();
}
Run Code Online (Sandbox Code Playgroud)
我需要在整个工作上超时(连接,等待和阅读 - 全部或单独).
我尝试httpclient = new DefaultHttpClient();在行之后设置超时参数:
int timeout=10;
httpclient.getParams().setParameter("http.socket.timeout", timeout * 1000);
httpclient.getParams().setParameter("http.connection.timeout", timeout * 1000);
httpclient.getParams().setParameter("http.connection-manager.timeout", new Long(timeout * 1000));
httpclient.getParams().setParameter("http.protocol.head-body-timeout", timeout * 1000);
Run Code Online (Sandbox Code Playgroud)
但它没有奏效(超过我设置的超时大约10倍后超时).
于是,我就一个线程取消使用一段时间后要求httpget.abort()与httpclient.getConnectionManager().shutdown()刚过httpget = new HttpGet("http://google.com");这样一行:
(new Timer()).schedule(new java.util.TimerTask() {
public void run() {
httpget.abort();
httpclient.getConnectionManager().shutdown();
}
},10000);
Run Code Online (Sandbox Code Playgroud)
但它没有效果(Timer运行;但这两行代码什么也没做!)!!
我也试过用这个:
URL url = new URL("http://google.com");
URLConnection con = url.openConnection();
con.setConnectTimeout(10000);
con.setReadTimeout(10000);
InputStream PIS = con.getInputStream();
Run Code Online (Sandbox Code Playgroud)
但它与我的第一次尝试相同(设置超时参数HttpClient)!!
问题是什么?
如何解决我的超时问题?
谢谢
不是解决方案,而是对正在发生的事情的更多解释.
你在做什么是正确的.
首先,如果您使用的是Log4J,请确保您看到HttpClient想要向您展示的所有内容:
log4j.logger.org.apache.http=trace
Run Code Online (Sandbox Code Playgroud)
然后看看这堂课:
此连接运算符可识别多家网络,并将尝试按顺序重试所有已知IP地址的失败连接,直到连接成功或所有已知地址无法响应.请注意,每次连接尝试都将使用相同的CoreConnectionPNames.CONNECTION_TIMEOUT值,因此在最坏的情况下,超时前的总经过时间可以是CONNECTION_TIMEOUT*n,其中n是给定主机的IP地址数.
这就是你的案件中最有可能发生的事情.
此外,最好使用此接口HttpConnectionParams中的常量:
SO_TIMEOUT = "http.socket.timeout"
TCP_NODELAY = "http.tcp.nodelay"
SOCKET_BUFFER_SIZE = "http.socket.buffer-size"
SO_LINGER = "http.socket.linger"
SO_REUSEADDR = "http.socket.reuseaddr"
CONNECTION_TIMEOUT = "http.connection.timeout"
STALE_CONNECTION_CHECK = "http.connection.stalecheck"
MAX_LINE_LENGTH = "http.connection.max-line-length"
MAX_HEADER_COUNT = "http.connection.max-header-count"
MIN_CHUNK_LIMIT = "http.connection.min-chunk-limit"
Run Code Online (Sandbox Code Playgroud)
你只需要其中两个:
HttpConnectionParams.CONNECTION_TIMEOUT
HttpConnectionParams.SO_TIMEOUT
Run Code Online (Sandbox Code Playgroud)
因此,解决此问题的最佳方法是实现仅返回一个IP地址的自定义ClientConnectionOperator.resolveHostname方法.