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¶m2=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 需要关闭吗的主要内容,如果未能解决你的问题,请参考以下文章
java httpclient httpget不关闭,会占用线程吗
Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)