默认情况下(即用默认构造方法建立HttpClient对象),httpMethod.releaseConnection()方法并不会关闭连接的Socket,目的是可以重用这个连接。网上有不少讨论:
- Re: CLOSE_WAIT, logging
- Re: [httpclient] CLOSE_WAIT sticking around
- Re: tcp connections left with CLOSE_WAIT
- apache httpclient与close_wait
这些讨论里提出了关闭Socket的方法,即在请求头里加上"Connection: close",具体可见HTTP协议规范里的说明。
其实HttpClient 3.x 里还可以通过下面的方式建立HttpClient对象,来保证关闭Socket连接:
HttpClient httpClient = new HttpClient(new SimpleHttpConnectionManager(true));
具体可见HttpClient源码和API文档。
当然,使用HttpClient的多线程连接管理器时就不用这么做了。