首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >http连接超时问题

http连接超时问题
EN

Stack Overflow用户
提问于 2011-01-02 17:13:48
回答 9查看 34K关注 0票数 17

当我尝试使用HttpClient连接到url时,我遇到了一个问题。即使在我设置了连接超时之后,http连接也需要更长的时间来超时。

代码语言:javascript
复制
int timeoutConnection = 5000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);

int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

它在大多数情况下都是完美的。然而,每隔一段时间,http连接就会永远运行,而忽略setconnectiontimeout,特别是当手机连接到wifi时,手机处于空闲状态时。

所以在手机空闲后,当我第一次尝试连接时,http连接忽略了setconnectiontimeout并永远运行,在我取消它并重试之后,它每次都像咒语一样工作。但是有一次它不起作用,它产生了一个threadtimeout错误,我试着使用另一个线程,它起作用了,但我知道这个线程运行了很长时间。

我知道wifi会在idle上睡觉,但我不明白为什么它会忽略setconnectiontimeout

任何人都能帮上忙,我真的很感激。

EN

回答 9

Stack Overflow用户

发布于 2011-01-02 19:50:34

不确定这是否对你有帮助,但我认为值得在这里分享。在使用超时工具时,我发现还有第三种超时类型可以分配:

代码语言:javascript
复制
// the timeout until a connection is established
private static final int CONNECTION_TIMEOUT = 5000; /* 5 seconds */

// the timeout for waiting for data
private static final int SOCKET_TIMEOUT = 5000; /* 5 seconds */

// ----------- this is the one I am talking about:
// the timeout until a ManagedClientConnection is got 
// from ClientConnectionRequest
private static final long MCC_TIMEOUT = 5000; /* 5 seconds */

...

HttpGet httpGet = new HttpGet(url);
setTimeouts(httpGet.getParams());

...

private static void setTimeouts(HttpParams params) {
    params.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 
        CONNECTION_TIMEOUT);
    params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, SOCKET_TIMEOUT);
    params.setLongParameter(ConnManagerPNames.TIMEOUT, MCC_TIMEOUT);
}
票数 9
EN

Stack Overflow用户

发布于 2011-04-01 02:38:06

代码语言:javascript
复制
Thread t=new Thread()
{
  public void run()
  {
    try 
    {
      Thread.sleep(absolutetimeout);
      httpclient.getConnectionManager().closeExpiredConnections();
      httpclient.getConnectionManager().closeIdleConnections(absolutetimeout,TimeUnit.MILLISECONDS);
      httpclient.getConnectionManager().shutdown();
      log.debug("We shutdown the connection manager!");
    }
    catch(InterruptedException e)
    {}
  }
};

t.start();
HttpResponse res= httpclient.execute(httpget);
t.interrupt();

这是不是和你们所说的一样?

我不太确定一旦执行开始后如何取消执行,但这似乎对我很有效。我不确定线程中的三行中哪一行完成了魔术,或者是它们全部的某种组合。

票数 1
EN

Stack Overflow用户

发布于 2011-05-21 16:17:23

我也遇到过同样的问题,我猜可能Android不支持这个参数。在我的例子中,我测试了ThreadSafeClientConnManager的所有三个参数

代码语言:javascript
复制
params.setParameter( ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(20) );
params.setIntParameter( ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 200 );
params.setLongParameter( ConnManagerPNames.TIMEOUT, 10 );
ThreadSafeClientConnManager connmgr = new ThreadSafeClientConnManager( params );

第一个和第二个运行得很好,但第三个并没有像文档中描述的那样工作。当DefaultHttpClient#execute()正在执行时,没有抛出异常,执行线程被无限期地阻塞。

请参阅http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e650

"...One可以通过将'http.conn-manager.timeout‘设置为正值来确保连接管理器在连接请求操作中不会无限期阻塞。如果无法在给定的时间段内处理连接请求,将引发ConnectionPoolTimeoutException。“

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4577804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档