本人在使用httpclient作接口测试的时候,最近程序偶然报socket closed错误,上周通过排查发现是request.releaseConnection()这个方法搞得鬼,也是本身学艺不精,没有真正理解方法的含义,改掉以后其余接口就没有出现过这个问题,今天又遇到了,又从新排查了本身的方法,发现还有一种致使socket closed的缘由,由于个人响应对象建立时用的是CloseableHttpResponse类,因此须要关闭,在某些时候response太大可能致使使用EntityUtils.toString(entity)解析实体的时候出错,我的理解是因为response的并未彻底解析到entity里面时已经执行了close()方法致使的,试着把close()方法后置,完美解决问题。java
下面是个人错误代码片断:编程
try { response.close(); } catch (IOException e2) { output("响应关闭失败!", e2); } data_size = entity.getContentLength();// 获取相应数据大小 if (data_size == -1) {// 若是为-1,则重置data_size data_size = 0; } String content = null; try { content = EntityUtils.toString(entity);// 用string接收响应实体 EntityUtils.consume(entity);// 消耗响应实体 } catch (ParseException e1) { output("解析响应实体异常!", e1); } catch (IOException e1) { output("解析响应实体时java IO 异常!", e1); } // 解析响应
下面是修改以后的代码片断:框架
String content = null; try { content = EntityUtils.toString(entity);// 用string接收响应实体 EntityUtils.consume(entity);// 消耗响应实体 } catch (ParseException e1) { output("解析响应实体异常!", e1); } catch (IOException e1) { output("解析响应实体时java IO 异常!", e1); } // 解析响应 try { response.close(); } catch (IOException e2) { output("响应关闭失败!", e2); }