一、一般代码编写方式:
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(url);
try {
CloseableHttpResponse response = httpclient.execute(httpPost);
HttpEntity httpEntity = response.getEntity();
return EntityUtils.toString(httpEntity, charset);
} catch (Exception e) {
logger.error("message code : " + e.getMessage(), e);
} finally {
httpPost.releaseConnection();
}
二、现象
如果分开机子,一台机子跑服务器,一台机子跑客户端,客户端使用HttpClient4来进行请求。
会发现TIME_WAIT(连接哪端主动关闭,TIME_WAIT将出现在哪端,并且等待2MSL时间才会回收,大约一分钟)均在客户端。
但是按照我们以前学校的知识点,http请求结束后,应该是由服务器关闭才是。
三、原因
其实这是自己知识点不足导致的,
HttpClient4发送的其实是http1.1的,而我上边的服务器自动关闭的知识点是http1.0的,
http1.0 默认短连接,服务器主动关闭, 需要长连接需要配置keepalive
http1.1 默认长连接,因此服务器不会主动关闭,而httpclient4我们一般会直接写httpPost.releaseConnection(),因此自然是我们客户端主动关闭了
通过nc -l port, 也可以知道httpclient4默认发送的http1.1协议的
因此,如果还是希望服务器短连接并且主动关闭,可以配置Connection:close在http header