Httpclient再续

参考:
[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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值