httpclient 需要关闭吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpclient 需要关闭吗相关的知识,希望对你有一定的参考价值。

需要
用httpclient都是访问完一个页面,处理完response才去访问下一个页面的。我没有试过同时,我想如果我需要同时,我会创建两个Httpclient对象。
你说在while中无限new 对象比较恶心,确实没错,但是你觉得你会创建多少个呢?几千个几万个吗?如果数量少的话,多创建几个并无不可吧。
你可能是在做一些刷流量的事情,但是你自身的网络资源是有限的,你在java虚拟机里面创建大量的client对象,是否真正能起到你想象中的作用,我认为未必。几千个client不会变成几千个线程,也不会变成几千个进程,实际上这些get包还是一个个发的。所以我相信,实际上你不需要大量的client对象。

另外关于访问量的事情,你需要调查清楚,是否是你这边的问题,因为你用同一个ip地址在短时间内访问同一个页面,是否每一次都计入总数,这是未必的,要看你访问的网站是否有做检查。

最后关于登陆,你需要使用post请求,它的用法和get差不多,区别是post请求的内容不在url内,你需要填写。我曾经写过登陆百度的代码,就相当于模拟浏览器给baidu登陆页面发送post请求。httpclient会为你管理cookie等东西,从而使得你保持登陆状态,你自己要注意的就是,登陆后要使用同一个httpclient对象
参考技术A 不关闭也可以
但建议关闭

HttpClient

1. 执行过程

    1) 创建可关闭的HttpClient连接

    2) 创建与服务器交互的方法对象:GET,POST,DELETE等,需要设置headers,请求正文参数

设置请求HttpEntity内容

//1.FileEntity
File file = new File("somefile.txt");
FileEntity entity = new FileEntity(file, 
    ContentType.create("text/plain", "UTF-8"));        
HttpPost httppost = new HttpPost("http://localhost/action.do");
httppost.setEntity(entity);

//2.Html Forms,下面例子会被编码为param1=value&param2=value的形式
List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("param1", "value1"));
formparams.add(new BasicNameValuePair("param2", "value2"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
HttpPost httppost = new HttpPost("http://localhost/handler.do");
httppost.setEntity(entity);

 

    3) 执行

    4)获得HttpResponse

        处理HttpEntity

//1.使用EntityUtils类,仅限数据长度小于Integer.maxLength()&&entity来自可信任的Http server
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpget = new HttpGet("http://localhost/");
CloseableHttpResponse response = httpclient.execute(httpget);
try {
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        long len = entity.getContentLength();
        if (len != -1 && len < 2048) {
            System.out.println(EntityUtils.toString(entity));
        } else {
            // Stream content out
        }
    }
} finally {
    response.close();
}

//2.HttpEntity#getContent()或者HttpEntity#writeTo(OuputStream)方法

//3.如果需要重复读取entity内容
CloseableHttpResponse response = <...>
HttpEntity entity = response.getEntity();
if (entity != null) {
    entity = new BufferedHttpEntity(entity);
}

 

    5)关闭结果流,关闭连接

以上是关于httpclient 需要关闭吗的主要内容,如果未能解决你的问题,请参考以下文章

httpclien模拟浏览器

java httpclient httpget不关闭,会占用线程吗

Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)

显示 Json 数组 Angular 5 HttpClient

HttpClient请求URL

使用 Httpclient 信任自签名证书