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

技术类文章精选

  1. java 一行代码打印心形
  2. Linux 性能监控软件 netdata 中文汉化版
  3. 接口测试代码覆盖率(jacoco)方案分享
  4. 性能测试框架
  5. 如何在 Linux 命令行界面愉快进行性能测试
  6. 图解 HTTP 脑图
  7. 如何测试概率型业务接口
  8. httpclient 处理多用户同时在线
  9. 将 swagger 文档自动变成测试代码
  10. 五行代码构建静态博客
  11. httpclient 如何处理 302 重定向
  12. 基于 java 的直线型接口测试框架初探

非技术文章精选

  1. 为什么选择软件测试作为职业道路?
  2. 成为杰出 Java 开发人员的 10 个步骤
  3. 写给所有人的编程思维
  4. 自动化测试的障碍
  5. 自动化测试的问题所在
  6. 测试之《代码不朽》脑图


↙↙↙阅读原文可查看相关链接,并与作者交流