【问题标题】:Timeout in DefaultHttpClientDefaultHttpClient 超时
【发布时间】:2013-04-11 21:18:56
【问题描述】:

我对 DefaultHttpClient 中的超时如何工作感到有些困惑。

我正在使用此代码:

private DefaultHttpClient createHttpClient() {
        HttpParams my_httpParams = new BasicHttpParams();

        HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000);
        HttpConnectionParams.setSoTimeout(my_httpParams, 15000);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        ThreadSafeClientConnManager multiThreadedConnectionManager = new ThreadSafeClientConnManager(my_httpParams, registry);

        DefaultHttpClient httpclient = new DefaultHttpClient(multiThreadedConnectionManager, my_httpParams);

        return httpclient;
}

.

String url = "http://www.example.com";

DefaultHttpClient httpclient = createHttpClient();
HttpGet httpget = new HttpGet(url);

try {
    HttpResponse response = httpclient.execute(httpget);
    StatusLine statusLine = response.getStatusLine();
    mStatusCode = statusLine.getStatusCode();

    if (mStatusCode == 200){
        content = EntityUtils.toString(response.getEntity());
    }

} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (IllegalStateException e){
    e.printStackTrace();
}

当 15 秒过去了,还没有收到所有数据时,会抛出异常,对吧?但在哪种方法上?我以为是.execute(httpget) 方法,但那个方法只告诉我它会抛出ClientProtocolExceptionIOException。谁能帮我澄清一下?

【问题讨论】:

    标签: java android timeout httpclient


    【解决方案1】:

    它确实会在execute() 上引发异常。 SocketTimeoutException 的父级是 IOException。处理 IOException 的 catch 块将能够同时捕获两者。

    尝试执行此代码。

    HttpParams my_httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000);
    HttpConnectionParams.setSoTimeout(my_httpParams, 1);
    DefaultHttpClient defaultHttpClient = new DefaultHttpClient(my_httpParams);
    HttpGet httpGet = new HttpGet("http://google.com");
    defaultHttpClient.execute(httpGet);
    

    这会导致这个异常。

    java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(Unknown Source)
        ...
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
    

    您始终可以选择通过捕获异常并稍后处理IOException 来选择性地处理异常。

    try
    {
        // Your code
    }
    catch (SocketTimeoutException e)
    {
        // handle timeouts
        e.printStackTrace();
    }
    catch (IOException e)
    {
        // handle other IO exceptions
        e.printStackTrace();
    }
    

    【讨论】:

      【解决方案2】:

      如果您查看http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e249 的 Apache 文档,它会注意到连接超时异常是 IOException 子类。

      更具体地说,我相信他们会ConnectTimeoutExceptions(如果无法在您配置的连接超时内建立连接)或SocketTimeoutExceptions(如果已设置但未收到您配置的 SO 的数据)超时。

      【讨论】:

        猜你喜欢
        • 2013-09-08
        • 2013-10-10
        • 2011-11-05
        • 2015-01-26
        • 2011-12-31
        • 2012-05-21
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        相关资源
        最近更新 更多