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