使用httpclient中EntityUtils类解析entity遇到socket closed错误的原因

来源:互联网 发布:php工作前景怎么样 编辑:程序博客网 时间:2024/06/08 05:56

本人在使用httpclient做接口测试的时候,最近程序偶然报socket closed错误,上周经过排查发现是request.releaseConnection()这个方法搞得鬼,也是自己学艺不精,没有真正理解方法的含义,改掉之后其他接口就没有出现过这个问题,今天又遇到了,又重新排查了自己的方法,发现还有一种导致socket closed的原因,因为我的响应对象创建时用的是CloseableHttpResponse类,所以需要关闭,在某些时候response太大可能导致使用EntityUtils.toString(entity)解析实体的时候出错,个人理解是由于response的并未完全解析到entity里面时已经执行了close()方法导致的,试着把close()方法后置,完美解决问题。

下面是我的错误代码片段:

try {response.close();} catch (IOException e2) {output("响应关闭失败!", e2);}data_size = entity.getContentLength();// 获取相应数据大小if (data_size == -1) {// 如果为-1,则重置data_sizedata_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);}


原创粉丝点击