本人在使用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_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);
}