http超时设置

294 篇文章 13 订阅
14 篇文章 1 订阅

http协议中可以设置超时(连接超时、响应超时),具体设置情景如下:

1、java api的方式:

JDK 1.5以前的版本,只能通过设置两个系统属性来控制网络超时:

String szUrl = “http://www.ee2ee.com/”;
URL url = new URL(szUrl);
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
//HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时:
System.setProperty(”sun.net.client.defaultConnectTimeout”, 超时毫秒数字符串);
System.setProperty(”sun.net.client.defaultReadTimeout”, 超时毫秒数字符串);

//sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)
//sun.net.client.defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)

在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:
setConnectTimeout:设置连接主机超时(单位:毫秒)
setReadTimeout:设置从主机读取数据超时(单位:毫秒)

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);

需要注意的是,笔者在JDK1.4.2环境下,发现在设置了 defaultReadTimeout的情况下,如果发生网络超时,HttpURLConnection会自动重新提交一次请求,出现一次请求调用,请求服务器两次的问题(Trouble)。我认为这是JDK1.4.2的一个bug。在JDK1.5.0中,此问题已得到解决,不存在自动重发现象。 out”, “30000″);

2、httpClient:

HttpClient工具类,有3.x和4.x两个大的版本,创建httpClient对象不一样:(推荐升级到4.x)

  • 3.X是这样的:HttpClient httpClient=new DefaultHttpClient();
  • 4.3是这样的:CloseableHttpClient httpClient = HttpClients.createDefault();

HttpClient有三种超时设置:

1)3.X的超时设置方法

HttpClient client = new HttpClient();
client.setConnectionTimeout(30000);  
client.setTimeout(30000);

HttpClient httpClient= new HttpClient();  
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

2)4.X版本的超时设置(4.3后已过时)

HttpClient httpClient=new DefaultHttpClient();
//连接时间
httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,2000);
//数据传输时间
httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,2000);

3)4.3版本超时设置

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet=new HttpGet("http://www.baidu.com");//HTTP Get请求(POST雷同)
RequestConfig requestConfig = RequestConfig.custom()
    .setSocketTimeout(2000)
    .setConnectTimeout(2000)
    .build();

httpGet.setConfig(requestConfig);
httpClient.execute(httpGet);//执行请求

3、curl命令:

使用curl时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间。
连接超时时间用 --connect-timeout 参数来指定,数据传输的最大允许时间用 -m 参数来指定。
例如:

curl --connect-timeout 10 -m 20 "http://XXXXXXX"
  • 连接超时的话,出错提示形如:curl: (28) connect() timed out!
  • 数据传输的最大允许时间超时的话,出错提示形如:curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received

4、ajax:

1)在xmlHttpRequest老版本中,没有超时属性,所以如果使用javascript原生的老版本ajax请求,只能通过手工设置settimeout和cleartimeout这两个方法完成(这两个方法是window对象的方法)

function createXMLHttpRequest() {  
    var request = false;  
    if (window.XMLHttpRequest) {  
        request = new XMLHttpRequest();  
        if (request.overrideMimeType) {  
            request.overrideMimeType('text/xml');  
        }  
    } else if (window.ActiveXObject) {  
        var versions = [ 'Microsoft.XMLHTTP', 'MSXML.XMLHTTP',  
                'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0',  
                'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0',  
                'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP' ];  
        for ( var i = 0; i < versions.length; i++) {  
            try {  
                request = new ActiveXObject(versions[i]);  
                if (request) {  
                    return request;  
                }  
            } catch (e) {  
            }  
        }  
    }  
    return request;  
}  
function ajax(xmlhttp, _method, _url, _param, _callback) {  
    if (typeof xmlhttp == 'undefined')  
        return;  
    xmlhttp.onreadystatechange = function() {  
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {  
            _callback(xmlhttp);  
        }  
    };  
    xmlhttp.open(_method, _url, true);  
    if (_method == "POST") {  
        xmlhttp.setRequestHeader("Content-Type",  
                "application/x-www-form-urlencoded");  
        xmlhttp.setRequestHeader("Content-Length", _param.length);  
        xmlhttp.send(_param);  
    } else {  
        xmlhttp.send(null);  
    }  
}  
// 使用举例  
var xmlhttp = createXMLHttpRequest();  
var t1; // 用来作超时处理  
function adduserok(request) {  
    // alert(request.responseText);  
    if (t1)  
        clearTimeout(t1);  
}  
function connecttoFail() {  
    if (xmlhttp)  
        xmlhttp.abort();  
    // alert ('Time out');  
}  
if (xmlhttp) {  
    ajax(xmlhttp, "POST", "http://10.1.2.187/adduser.cgi", "act=do&user=abc",  
            adduserok);  
    t1 = setTimeout(connecttoFail, 30000);  
} else {  
    alert("Init xmlhttprequest fail");  
}  

2)上面这种手动处理ajax的适合初级阶段,如果使用jquery框架,那么在jquery中可以设置timeout超时属性:

 $.ajax({
  url:'',  //请求的URL
  timeout : 1000, //超时时间设置,单位毫秒
  type : 'get',  //请求方式,get或post
  data :{},  //请求所传参数,json格式
  dataType:'json',//返回的数据格式
  success:function(data){ //请求成功的回调函数
    alert("成功");
  },
  complete : function(XMLHttpRequest,status){ //请求完成后最终执行参数
    if(status=='timeout'){//超时,status还有success,error等值的情况
       ajaxTimeoutTest.abort();
       alert("超时");
    }
  }
});

3)xmlHttpRequest level2新版本中,增加了超时属性,并且有超时事件:

xhr.timeout = 3000;
xhr.ontimeout = function(event){
    alert('请求超时!');
}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值