httpclient = new DefaultHttpClient(cm);//可以通过入参设置manager等,建议使用PoolingClientConnectionManager。 线程安全

  • http3.X:需要手动调用releaseConnection去释放连接。对每一个HttpClient.executeMethod须有一个method.releaseConnection()与之匹配。每次请求结束后,都需要将链接交还给连接池,否则池子会被耗尽
  • http4.x:如果使用InputStream.close()来确认连接释放(不会释放socket,可重用);EntityUtils.consume内部执行该close,也可确保连接被返回给连接池。HttpClient一旦检测到流的末尾的内容已经到达,就自动释放基础连接返回到连接管理器。
    method.abort(),在异常或status不正常时调用,关闭连接,底层资源释放,不被重用。
    client.getHttpConnectionManager()).shutdown();//此处释放连接池,关闭所有链接。
    连接池中的链接默认永久保持,最终由服务器端决定。
    连接是否保持: 客户端如果希望保持长连接,应该在发起请求时告诉服务器希望服务器保持长连接(http 1.0设置connection字段为keep-alive,http 1.1字段默认保持)。根据服务器的响应来确定是否保持长连接,判断原则如下:
  • 检查返回response报文头的Transfer-Encoding字段,若该字段值存在且不为chunked,则连接不保持,直接关闭。其他情况进入下一步。
  • 检查返回的response报文头的Content-Length字段,若该字段值为空或者格式不正确(多个长度,值不是整数),则连接不保持,直接关闭。其他情况进入下一步
  • 检查返回的response报文头的connection字段(若该字段不存在,则为Proxy-Connection字段)值
  • 如果这俩字段都不存在,则http 1.1版本默认为保持,将连接标记为保持, 1.0版本默认为连接不保持,直接关闭。
  • 如果字段存在,若字段值为close 则连接不保持,直接关闭;若字段值为keep-alive则连接标记为保持

netstat –an查看链接时,TIME_WAIT的状态会出现在主动关闭链接的这一端,保证数据的完整性。

服务器A会去请求服务器B上面的apache获取文件资源,正常情况下,如果请求成功,那么在抓取完资源后服务器A会主动发出关闭连接的请求,这个时候就是主动关闭连接,连接状态我们可以看到是TIME_WAIT。如果一旦发生异常呢?假设请求的资源服务器B上并不存在,那么这个时候就会由服务器B发出关闭连接的请求,服务器A就是被动的关闭了连接,如果服务器A被动关闭连接之后自己并没有释放连接,那就会造成CLOSE_WAIT的状态了。
如果连接在pool中,但是对端主动close了socket,则此时本地socket进入CLOSE_WAIT,但是pool感知不到。此时需要专门的检测任务进行处理。

注意:不同的post组装方式会导致parameters的获取方式不同。同时postbody的parameter获取,受contenttype影响。