http超时设置

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('请求超时!');
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 22:48:53

http超时设置的相关文章

Outlook Web App 客户端超时设置

这篇文章我们讨论一下,OWA 2013在公共和私人的电脑是如何启用和配置. Exchange 2013 Outlook Web App (OWA) 登录页不再允许用户选择无论他们正在使用公共的或私人的计算机.默认情况下,OWA 2013 是假定用户使用的是私人计算机,如使用超时的 8 小时.出于安全考虑,用户处于非活动状态之前要求用户重新登录. 在 Set-OWAVirtualDirectory cmdlet 中 LogonPagePublicPrivateSelectionEnabled 参数

org.apache.http.client.HttpClient; HttpClient 4.3超时设置

可用的code public static String doPost(String url, String params, String contentType) /*throws IOException */{ CloseableHttpClient client = HttpClients.createDefault(); RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(httpSoTimeout)

connect socket的超时设置

最近项目中,有个需求是检测某ip地址是否是通的,使用了socket的connect函数.但是,当ip地址写错的话,connect就会一直阻塞在那里,大概2.3分钟才能返回连接失败.这对于用户来说是不可接受的.下面的文章介绍了两种方法实现这种超时设置: 转自http://blog.csdn.net/ast_224/article/details/2957294  connect超时: 目前各平台通用的设置socket connect超时的办法是通过select(),具体方法如下: 1.建立sock

添加MySql数据库超时设置的相关问题

最近在工作中, 遇到MySql数据库连接超时的问题,申同事帮忙解决了一下,看到原来的MySqlHelper里面没有封装相关的超时方法,就添加了一个,我在这里记录了一下,希望对像我一样入门级的程序员有所帮助: 如下方法: Private int ExecuteScalarBySql(string sqlstr) { try{ using((MySqlConnection mysqlconn)=new MySqlConnection(Config.ConnectionStrings)) { mysq

使用Jsoup获取网页内容超时设置

使用Jsoup获取网页内容超时设置 最近使用Jsoup来抓取网页,并对网页进行解析,发现很好用.在抓取过程中遇到一个问题,有些页面总是报Timeout异常,开始想是不是被抓取网站对IP进行了限制,后来发现用HttpClient可以获取到内容. 原来我最开始使用Jsoup.connect(url).get();方法获取网页内容,这种方式使用的是默认超时时间3秒. 原来Jsoup是可以设置超时的,修改成如下就可以了: Jsoup.connect(url).timeout(30000).get();

你应该知道的那些超时设置或默认参数 good

defaultStatementTimeout Sets the number of seconds the driver will wait for a response from the database. Any positive integer Not Set (null) http://www.mybatis.org/mybatis-3/configuration.html 存储介质 Redis Java-Driver Jedis 连接池:Jedis的连接池设计基于 Apache Co

libcurl多线程超时设置不安全(转)

from http://www.cnblogs.com/kex1n/p/4135263.html (1), 超时(timeout) libcurl 是 一个很不错的库,支持http,ftp等很多的协议.使用库最大的心得就是,不仔细看文档,仅仅看着例子就写程序,是一件危险的事情.我的程序崩溃了,我 怀疑是自己代码写的问题,后来发现是库没用对.不仔细看文档(有时候文档本身也比较差劲,这时除了看仔细外,还要多动脑子,考虑它是怎么实现的),后果很 严重.不加思索的使用别人的库或者代码,有时候很惬意,但是

基础入门_Python-模块和包.Gevent异步/状态获取/超时设置/猴子补丁?

简单介绍: 说明: Gevent是一个基于libev的并发库,为各种并发和网络相关的任务提供了整洁的API 快速安装: pip install --upgrade gevent 主要模式: 说明: Greenlet以C扩展模块形式接入PY轻量级协程,它们运行于主进程内部,被协作式的调度,且不同于multiprocessing和threading等真正的并行执行,它在同一时刻只能有一个协程在运行 公有方法 gevent.spawn(cls, *args, **kwargs) 创建一个Greenle

Delphi使用进行post数据时超时设置

因项目需要进行http的post提交数据,开始时用indy的idHttp组件,但是测试时发现当网络中断(如拔掉网线),idHttp的超时设置无效果,要等20秒才提示超时(参考网上的做法,将indy9升级到indy10,且设置了idHttp的connetTimeout,ReadTimeout属性,均无效果). 后来发现用ICS组件THttpCli可以很好的控制提交超时,达到我的目的. ICS版本:OverbyteIcsV7Gold 下载:http://www.overbyte.be/arch/Ov

Socket编程实践(9) --套接字IO超时设置方法

引:超时设置3种方案 1. alarm超时设置方法 //代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) { return ; } signal(SIGALRM, sigHandlerForSigAlrm); alarm(5); int ret = read(sockfd, buf, sizeof(buf)); if (ret == -1 && errno == EINTR) { // 超时被时钟打断 errno = ETIMEDOUT;