使用 httpclient 的连接持久性

Posted

技术标签:

【中文标题】使用 httpclient 的连接持久性【英文标题】:connection persistence using httpclient 【发布时间】:2013-02-27 06:33:50 【问题描述】:

我使用 httpclient.execute(request) 向同一个 url 发出多个请求。 我可以将连接重新用于连续请求吗? 如何在不反复声明 HttpClient 的情况下优化代码。

for(int i=0;i<=50;i++)

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("my_url");
HttpResponse response = client.execute(request);
System.out.println(response.getStatusLine().getStatusCode());

【问题讨论】:

是的,我尝试了很多搜索。但我找不到示例代码 是的,我尝试了很多很多的改变,但我做不到。如果你觉得让开发人员问这个问题很愚蠢,那么请帮我解决这个问题。我把客户端放在外面也试过了,它给出了错误:连接仍然打开。我如何重新使用它。这将是我尝试的第一件事。 【参考方案1】:

为了在您的代码中使用单个客户端(基于 Exception using HttpRequest.execute(): Invalid use of SingleClientConnManager: connection still allocated 和 Lars Vogel Apache HttpClient - Tutorial):

步骤 1. 将客户端代移到 for-loop 之外。

第 2 步。您应该阅读响应内容并关闭流。如果你不这样做,你会得到以下异常

Exception in thread "main" java.lang.IllegalStateException: 
    Invalid use of SingleClientConnManager: connection still allocated.

在代码中:

//step 1
HttpClient client = new DefaultHttpClient();
for(int i=0;i<=50;i++) 
    HttpGet request = new HttpGet("my_url");
    HttpResponse response = client.execute(request);
    System.out.println(response.getStatusLine().getStatusCode());
    //step 2
    BufferedReader br = new BufferedReader(
        new InputStreamReader(response.getEntity().getContent()));
    //since you won't use the response content, just close the stream
    br.close();

【讨论】:

哇。有效。我刚刚关闭了流并且它起作用了。我在想我从来没有打开过流,我只是在阅读状态码,不需要打开响应并关闭它。无论如何,非常感谢:):) 我收到错误:org.apache.http.client.protocol.ResponseProcessCookies processCookies。你能帮我解决这个问题吗? @user2071013 相关:***.com/q/7459279/1065197检查第一和第二个答案以解决问题 谢谢。但第一个答案说它无法修复,第二个答案不起作用。我认为这是服务器问题,我们无法在代码中处理它。 @user2071013 另一个相关答案:***.com/a/4595054/1065197 在此之后,我找不到另一个解决方案 =\【参考方案2】:

试试下面。

HttpUriRequest httpGet = new HttpGet(uri);
DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
HttpResponse httpResponse = defaultHttpClient.execute(httpGet);

【讨论】:

我仍然得到:使用 HttpRequest.execute() 的异常:SingleClientConnManager 的使用无效:连接仍然分配 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。

以上是关于使用 httpclient 的连接持久性的主要内容,如果未能解决你的问题,请参考以下文章

Http 持久连接与 HttpClient 连接池

HttpClient使用学习

学习充电Http 持久连接与 HttpClient 连接池

Http 持久连接与 HttpClient 连接池

Http 持久连接与 HttpClient 连接池

httpclient 学习