0

我们创建了一个派生自DefaultHttpClient并使用ConnectionKeepAliveStrategy. 现在我想知道在运行时是ClientConnectionManager重用了一个连接还是创建了一个新的连接(例如,因为与服务器的连接超时)。

我怎么知道?

public class MyHttpClient extends DefaultHttpClient
{
    // some code setting constants

        public MyHttpClient()
        {
            super();

            // some code setting http connection params


            setKeepAliveStrategy(new ConnectionKeepAliveStrategy()
            {
                @Override
                public long getKeepAliveDuration(final HttpResponse response, final HttpContext context)
                {
                    return KEEP_ALIVE_TIMEOUT * MS_PER_SECOND;
                }
            });

        }

    @Override
    protected ClientConnectionManager createClientConnectionManager()
    {

        // some code registering HTTP and HTTPS 

        return new ThreadSafeClientConnManager(getParams(), registry);
    }       

    // some code for the socketfactory
}

// At some other class:

public class SomeClass
{
   private static final HttpClient HTTP_CLIENT = new MyHttpClient();

   public void someMethod()
   {
    /* some code */

    HttpGet get = new HttpGet(some url);
    HttpResponse getResponse = HTTP_CLIENT.execute(get);

    /* more code */
   }
}

当我们打电话时HTTP_CLIENT.execute(),我如何才能看到新连接是由创建的ClientConnectionManager还是现有的连接被重用?

4

1 回答 1

0

好的,我通过搜索互联网并测量使用 https 连接获取大量数据所需的时间来弄清楚:

  1. 默认情况下,clientConnectionManager 将尝试重用连接,无论您是否定义了保持活动策略。setKeepAlive 策略会给你一些修补的东西,但我找不到获取数据所需的时间有多大差异。

  2. 使用 setReuseStrategy 您可以确保在数据获取时始终建立一个新连接,然后我发现获取大量数据的时间通常会加倍!这是因为建立 https 连接的开销。

于 2012-08-16T06:16:33.267 回答