http超时设置

朴灿烈づ我的快乐病毒、 2021-06-24 14:34 968阅读 0赞

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

1、java api的方式:

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

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

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

  1. HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
  2. urlCon.setConnectTimeout(30000);
  3. 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对象的方法)

  1. function createXMLHttpRequest() {
  2. var request = false;
  3. if (window.XMLHttpRequest) {
  4. request = new XMLHttpRequest();
  5. if (request.overrideMimeType) {
  6. request.overrideMimeType('text/xml');
  7. }
  8. } else if (window.ActiveXObject) {
  9. var versions = [ 'Microsoft.XMLHTTP', 'MSXML.XMLHTTP',
  10. 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0',
  11. 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0',
  12. 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP' ];
  13. for ( var i = 0; i < versions.length; i++) {
  14. try {
  15. request = new ActiveXObject(versions[i]);
  16. if (request) {
  17. return request;
  18. }
  19. } catch (e) {
  20. }
  21. }
  22. }
  23. return request;
  24. }
  25. function ajax(xmlhttp, _method, _url, _param, _callback) {
  26. if (typeof xmlhttp == 'undefined')
  27. return;
  28. xmlhttp.onreadystatechange = function() {
  29. if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
  30. _callback(xmlhttp);
  31. }
  32. };
  33. xmlhttp.open(_method, _url, true);
  34. if (_method == "POST") {
  35. xmlhttp.setRequestHeader("Content-Type",
  36. "application/x-www-form-urlencoded");
  37. xmlhttp.setRequestHeader("Content-Length", _param.length);
  38. xmlhttp.send(_param);
  39. } else {
  40. xmlhttp.send(null);
  41. }
  42. }
  43. // 使用举例
  44. var xmlhttp = createXMLHttpRequest();
  45. var t1; // 用来作超时处理
  46. function adduserok(request) {
  47. // alert(request.responseText);
  48. if (t1)
  49. clearTimeout(t1);
  50. }
  51. function connecttoFail() {
  52. if (xmlhttp)
  53. xmlhttp.abort();
  54. // alert ('Time out');
  55. }
  56. if (xmlhttp) {
  57. ajax(xmlhttp, "POST", "http://10.1.2.187/adduser.cgi", "act=do&user=abc",
  58. adduserok);
  59. t1 = setTimeout(connecttoFail, 30000);
  60. } else {
  61. alert("Init xmlhttprequest fail");
  62. }

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

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,968人围观)

还没有评论,来说两句吧...

相关阅读