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是這樣的
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時,有兩個逾時時間:一個是連線逾時時間,另一個是資料轉送的最大允許時間。
連線逾時時間用 --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('請求逾時。');}