http逾時設定

來源:互聯網
上載者:User

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('請求逾時。');}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.