参考:
[url]http://wangxinchun.iteye.com/blog/2136254[/url]
[url]http://wangxinchun.iteye.com/blog/2156660[/url]
[url]http://wangxinchun.iteye.com/blog/2166837[/url]
最近所在的项目中准备把httpclient3换为httpcient4
有以下问题:
1、超时的设置。
httpclient3的设置比较简单:
httpclient4的设置有两种:
1、全局的设置。
2、每次请求的设置。
优先级:每次请求的设置,会优先全局的设置。
从下面代码的取值顺序可以看出参数的优先级顺序
优先级代码如下:
2、htttclent3 和 httpclient4的比较。
性能:差异并不大
稳定性:httpclient4 提供了连接池管理,更加稳定,httpclient3 每次创建Httpclient,并发量如果不限制,容易导致系统崩溃。
例如:启动一个http服务,然后使用httpclient 持续循环请求,如果不限制并发,tomcat就会挂掉。
3、服务端端口状态解释
服务端,端口的状态变化
先在本机(IP地址为:127.0.0.1:888)配置tomcat服务,然后在其它计算机(IP地址为:127.0.0.1)访问http服务,从cmd看看端口的状态变化。
1、LISTENING状态
HTTP服务启动后首先处于侦听(LISTENING)状态。
State显示是LISTENING时表示处于侦听状态,就是说该端口是开放的,等待连接,但还没有被连接。就像你房子的门已经敞开的,但还没有人进来。
[img]http://dl2.iteye.com/upload/attachment/0103/2330/b34e8521-c4cd-3760-bc70-ee4e52b133f1.jpg[/img]
2、ESTABLISHED状态
现在从本机访问一下888上的HTTP服务。 ESTABLISHED的意思是建立连接。表示两台机器正在通信。
下面显示的是本机的http服务正在被本机的众多连接请求,大部分连接建立了,但是都在传输数据。
[img]http://dl2.iteye.com/upload/attachment/0103/2334/0feb93ea-bc8f-3670-a9f6-74ecf34706d6.jpg[/img]
注意:处于ESTABLISHED状态的连接一定要格外注意,因为它也许不是个正常连接。后面我们要讲到这个问题。
3、 TIME_WAIT状态
我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。
TIME_WAIT的意思是结束了这次连接。说明888端口曾经有过访问,但访问结束了。
[img]http://dl2.iteye.com/upload/attachment/0103/2336/4d13e98e-63c4-3c8b-bad6-b70580d1fb47.jpg[/img]
大部分连接都在等待。
4、SYN_SENT
SYN_SENT状态表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为ESTABLISHED,此时SYN_SENT状态非常短暂。
服务器已经挂掉,我继续请求这个接口,会导致大量的连接处于这个数据发送状态。
[img]http://dl2.iteye.com/upload/attachment/0103/2342/889281b8-b16a-31bb-8469-96c46b4a0b47.jpg[/img]
客户端会反馈:
org.apache.http.conn.HttpHostConnectException: Connection to http://127.0.0.1:888 refused
5、CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭
状态之间的转换:
[img]http://dl2.iteye.com/upload/attachment/0103/2344/7e111f58-08a3-3270-939a-3492cb60b937.jpg[/img]
参考:
[url]http://www.cnblogs.com/thinksasa/archive/2013/03/05/2944880.html[/url]
[url]http://wangxinchun.iteye.com/blog/2136254[/url]
[url]http://wangxinchun.iteye.com/blog/2156660[/url]
[url]http://wangxinchun.iteye.com/blog/2166837[/url]
最近所在的项目中准备把httpclient3换为httpcient4
有以下问题:
1、超时的设置。
httpclient3的设置比较简单:
HttpClient httpClient = new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(connTimeoutMinis);
httpClient.getHttpConnectionManager().getParams().setSoTimeout(readTimeoutMinis);
httpclient4的设置有两种:
1、全局的设置。
2、每次请求的设置。
优先级:每次请求的设置,会优先全局的设置。
httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connTimeoutMinis);
httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, readTimeoutMinis);
HttpGet httpGet = new HttpGet(url);
httpGet.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, connTimeoutMinis);
httpGet.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, readTimeoutMinis);
从下面代码的取值顺序可以看出参数的优先级顺序
优先级代码如下:
public class ClientParamsStack {
/** The application parameter collection, or <code>null</code>. */
protected final HttpParams applicationParams;
/** The client parameter collection, or <code>null</code>. */
protected final HttpParams clientParams;
/** The request parameter collection, or <code>null</code>. */
protected final HttpParams requestParams;
/** The override parameter collection, or <code>null</code>. */
protected final HttpParams overrideParams;
public Object getParameter(String name) {
if (name == null) {
throw new IllegalArgumentException
("Parameter name must not be null.");
}
Object result = null;
if (overrideParams != null) {
result = overrideParams.getParameter(name);
}
if ((result == null) && (requestParams != null)) {
result = requestParams.getParameter(name);
}
if ((result == null) && (clientParams != null)) {
result = clientParams.getParameter(name);
}
if ((result == null) && (applicationParams != null)) {
result = applicationParams.getParameter(name);
}
return result;
}
}
2、htttclent3 和 httpclient4的比较。
性能:差异并不大
稳定性:httpclient4 提供了连接池管理,更加稳定,httpclient3 每次创建Httpclient,并发量如果不限制,容易导致系统崩溃。
例如:启动一个http服务,然后使用httpclient 持续循环请求,如果不限制并发,tomcat就会挂掉。
3、服务端端口状态解释
服务端,端口的状态变化
先在本机(IP地址为:127.0.0.1:888)配置tomcat服务,然后在其它计算机(IP地址为:127.0.0.1)访问http服务,从cmd看看端口的状态变化。
1、LISTENING状态
HTTP服务启动后首先处于侦听(LISTENING)状态。
State显示是LISTENING时表示处于侦听状态,就是说该端口是开放的,等待连接,但还没有被连接。就像你房子的门已经敞开的,但还没有人进来。
[img]http://dl2.iteye.com/upload/attachment/0103/2330/b34e8521-c4cd-3760-bc70-ee4e52b133f1.jpg[/img]
2、ESTABLISHED状态
现在从本机访问一下888上的HTTP服务。 ESTABLISHED的意思是建立连接。表示两台机器正在通信。
下面显示的是本机的http服务正在被本机的众多连接请求,大部分连接建立了,但是都在传输数据。
[img]http://dl2.iteye.com/upload/attachment/0103/2334/0feb93ea-bc8f-3670-a9f6-74ecf34706d6.jpg[/img]
注意:处于ESTABLISHED状态的连接一定要格外注意,因为它也许不是个正常连接。后面我们要讲到这个问题。
3、 TIME_WAIT状态
我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。
TIME_WAIT的意思是结束了这次连接。说明888端口曾经有过访问,但访问结束了。
[img]http://dl2.iteye.com/upload/attachment/0103/2336/4d13e98e-63c4-3c8b-bad6-b70580d1fb47.jpg[/img]
大部分连接都在等待。
4、SYN_SENT
SYN_SENT状态表示请求连接,当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为ESTABLISHED,此时SYN_SENT状态非常短暂。
服务器已经挂掉,我继续请求这个接口,会导致大量的连接处于这个数据发送状态。
[img]http://dl2.iteye.com/upload/attachment/0103/2342/889281b8-b16a-31bb-8469-96c46b4a0b47.jpg[/img]
客户端会反馈:
org.apache.http.conn.HttpHostConnectException: Connection to http://127.0.0.1:888 refused
5、CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭
状态之间的转换:
[img]http://dl2.iteye.com/upload/attachment/0103/2344/7e111f58-08a3-3270-939a-3492cb60b937.jpg[/img]
参考:
[url]http://www.cnblogs.com/thinksasa/archive/2013/03/05/2944880.html[/url]