精华内容
下载资源
问答
  • setreadtimeout
    千次阅读
    2016-08-15 09:40:54

    1、问题描述
    下载过程中如果网络中断或网络较差,个别应用的下载就会阻塞卡住,一直卡在 “正在下载 xx%”。

    2、问题排查和定位
    思考:网络差不应该报网络异常的错误或者直接抛timeout异常吗?所以马上去检查Http请求的地方:发现在DownloadThread中使用HttpURLConnection进行网络请求时只是设置了connectTimeout,这样在建立连接的时候如果网络中断,那么超时以后就会报出错误,这里是没有问题的。会不会是还少设置了其他参数的原因呢?

    于是赶紧去查阅资料:
    ConnectTimeout只有在网络正常的情况下才有效,而当网络不正常时,ReadTimeout才真正的起作用,即IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,因此,这2个属性应该结合实用。

    connect timeout 是建立连接的超时时间;
    read timeout,是传递数据的超时时间。

    正确的方法应当是调用HttpURLConnection的时候同时设置这两个超时时间。
    一看代码,果然漏了setReadTimeout。。。。。OMG 。。。

    3、解决方案
    同时设置这两个超时时间:
    HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
    urlCon.setConnectTimeout(20*1000);
    urlCon.setReadTimeout(20*1000);

    更多相关内容
  • 也就是说setReadTimeout not mean read complete, it mean when wait for 10s, when there’re no more data read in, will throw a timeoutexception。 所以针对这种特殊的服务器构造的异常流,是没法用...

    今天群里有位360的安全大佬,发了个链接http://93.175.29.89:8008/,说爬这个网址的时候,IO会一直卡在那,一直没有返回响应。

    那个网址是他构造的一个特殊请求,输出一个视频流,但是服务器端不返回Content-Length,也不输出真实数据,就是输出不到1024字节的流后就一直停在那也不close,浏览器打开的效果就是看到了视频的前几帧,然后一直卡在哪转圈。

    这么说来,感觉不是个大问题,设置下ReadTimeout不就好了么,大佬说他也设置了,但是无效,他使用的python代码实现,刚开始我觉得是他代码的问题,或者那个API库实现的问题,就用Java也实现了一把

    package sms.bai.util;

    import com.squareup.okhttp.Headers;

    import com.squareup.okhttp.OkHttpClient;

    import com.squareup.okhttp.Request;

    import com.squareup.okhttp.Response;

    import java.io.IOException;

    import java.util.concurrent.*;

    public class Req {

    public static void reqUrl() throws IOException {

    OkHttpClient client = new OkHttpClient();

    client.setConnectTimeout(5,TimeUnit.SECONDS);

    client.setReadTimeout(5,TimeUnit.SECONDS);

    Request request = new Request.Builder()

    .url("http://93.175.29.89:8008/")

    .build();

    Response response = client.newCall(request).execute();

    if (!response.isSuccessful()) {

    throw new IOException("服务器端错误: " + response);

    }

    Headers responseHeaders = response.headers();

    for (int i = 0; i < responseHeaders.size(); i++) {

    System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));

    }

    System.out.println(response.body().string());

    }

    public static void main(String[] args) throws IOException {

    reqUrl();

    }

    }

    果然如其所言,无论设置ConnectTimeout还是ReadTimeout都是无效的,代码一直停留在输出那里,不输出任何body(浏览器里还能勉强看到画面),程序也不stop

    Content-Type: multipart/x-mixed-replace;boundary=---nessy2jpegboundary

    OkHttp-Sent-Millis: 1582028133591

    OkHttp-Received-Millis: 1582028133875

    这里用的是OkHttp库 ,换其它库或者用Java自带的HttpUrlConnection理论上效果也是一样的。

    用ffmpeg来看看这个请求

    [kk@kk ~]$ ffmpeg -i http://93.175.29.89:8008/ -f mp4 out.mp4

    ffmpeg version n4.2.2 Copyright (c) 2000-2019 the FFmpeg developers

    built with gcc 9.2.0 (GCC)

    libavutil 56. 31.100 / 56. 31.100

    libavcodec 58. 54.100 / 58. 54.100

    libavformat 58. 29.100 / 58. 29.100

    libavdevice 58. 8.100 / 58. 8.100

    libavfilter 7. 57.100 / 7. 57.100

    libswscale 5. 5.100 / 5. 5.100

    libswresample 3. 5.100 / 3. 5.100

    libpostproc 55. 5.100 / 55. 5.100

    Input #0, mpjpeg, from 'http://93.175.29.89:8008/':

    Duration: N/A, bitrate: N/A

    Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 640x480 [SAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc

    Stream mapping:

    Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))

    Press [q] to stop, [?] for help

    [libx264 @ 0x562ad6812cc0] using SAR=1/1

    [libx264 @ 0x562ad6812cc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2

    [libx264 @ 0x562ad6812cc0] profile High, level 3.0, 4:2:0, 8-bit

    [libx264 @ 0x562ad6812cc0] 264 - core 159 r2991 1771b55 - H.264/MPEG-4 AVC codec - Copyleft 2003-2019 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00

    Output #0, mp4, to 'out.mp4':

    Metadata:

    encoder : Lavf58.29.100

    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuvj420p(pc), 640x480 [SAR 1:1 DAR 4:3], q=-1--1, 25 fps, 12800 tbn, 25 tbc

    Metadata:

    encoder : Lavc58.54.100 libx264

    Side data:

    cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1

    frame= 83 fps=1.1 q=-1.0 Lsize= 336kB time=00:00:03.20 bitrate= 859.8kbits/s speed=0.0436x

    ffmpeg 能识别出是一个视频流,但是会一直卡在frame=xx这里,一直读取帧而不停止。强行终止后能输出一个时长有几秒的视频

    看来依靠HttpUrlConnection中的SocketTimeoutException是无解了,只能在外面套一层了。main方法改成如下

    public static void main(String[] args) throws Exception {

    final ExecutorService exec = Executors.newFixedThreadPool(1);

    Callable call = new Callable() {

    public String call() throws Exception {

    //开始执行耗时操作

    reqUrl();

    return "线程执行完成.";

    }

    };

    Future future = null;

    try {

    future = exec.submit(call);

    String obj = future.get(1000 * 10, TimeUnit.MILLISECONDS); //任务处理超时时间设为 10 秒

    System.out.println("任务成功返回:" + obj);

    } catch (TimeoutException ex) {

    System.out.println("处理超时啦....");

    ex.printStackTrace();

    future.cancel(true);

    } catch (Exception e) {

    System.out.println("处理失败.");

    e.printStackTrace();

    }finally {

    // 关闭线程池

    System.out.println("关闭线程池");

    exec.shutdown();

    }

    }

    这下能得到期望的结果了

    Content-Type: multipart/x-mixed-replace;boundary=---nessy2jpegboundary

    OkHttp-Sent-Millis: 1582028854911

    OkHttp-Received-Millis: 1582028855178

    处理超时啦....

    java.util.concurrent.TimeoutException

    at java.util.concurrent.FutureTask.get(FutureTask.java:205)

    at sms.bai.util.Req.main(Req.java:47)

    关闭线程池

    Process finished with exit code 0

    那这个HttpUrlConnection里的超时到底是啥意思呢?为什么无效呢?看一下文档。

    ConnectTimeout , java 是这样解释的:

    Sets a specified timeout value, in milliseconds, to be used when opening a communications link to the resource referenced by this URLConnection. If the timeout expires before the connection can be established, a java.net.SocketTimeoutException is raised. A timeout of zero is interpreted as an infinite timeout.

    Some non-standard implmentation of this method may ignore the specified timeout. To see the connect timeout set, please call getConnectTimeout().

    意思是用来建立连接的时间。如果到了指定的时间,还没建立连接,则报异常。 这个比较好理解。

    ReadTimeout , Java 是这样解释的:

    Sets the read timeout to a specified timeout, in milliseconds. A non-zero value specifies the timeout when reading from Input stream when a connection is established to a resource. If the timeout expires before there is data available for read, a java.net.SocketTimeoutException is raised. A timeout of zero is interpreted as an infinite timeout.

    Some non-standard implementation of this method ignores the specified timeout. To see the read timeout set, please call getReadTimeout().

    意思是已经建立连接,并开始读取服务端资源。如果到了指定的时间,没有可能的数据被客户端读取,则报异常。

    也就是说setReadTimeout not mean read complete, it mean when wait for 10s, when there’re no more data read in, will throw a timeoutexception。

    所以针对这种特殊的服务器构造的异常流,是没法用SocketTimeoutException来解决超时的,只能在外面再设置一层,通过线程的超时来控制。

    另外提一句,python是通过设置gevent超时来解决的,原理是一样的。

    tips:360大佬认为,这种特殊URL,不失为一种给爬虫挖坑的做法。

    展开全文
  • 一看代码,果然漏了setReadTimeout。。。。。OMG 。。。 3、解决方案 同时设置这两个超时时间: URLConnection connection = url.openConnection(); connection.setConnectTimeout(5000); // 5秒 连接主机的超时...

    1、问题描述

    因为用户登录记录需要记录登录地址,这个地址获取调用的是阿里的接口,登录的时候由于connect没有响应,造成一直卡在登录界面。

     

    2、问题排查和定位

    思考:网络差不应该报网络异常的错误或者直接抛timeout异常吗?所以马上去检查Http请求的地方.

     

    备注:(在DownloadThread中使用HttpURLConnection进行网络请求时只是设置了connectTimeout,这样在建立连接的时候如果网络中断,那么超时以后就会报出错误,这里是没有问题的。会不会是还少设置了其他参数的原因呢?)

     

    于是赶紧去查阅资料:

    ConnectTimeout只有在网络正常的情况下才有效,而当网络不正常时,ReadTimeout才真正的起作用,即IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,因此,这2个属性应该结合实用。

     

    connect timeout 是建立连接的超时时间;

    read timeout,是传递数据的超时时间。

     

    正确的方法应当是调用HttpURLConnection的时候同时设置这两个超时时间。

    一看代码,果然漏了setReadTimeout。。。。。OMG 。。。

     

    3、解决方案

    同时设置这两个超时时间:

     
    1. URLConnection connection = url.openConnection();

    2. connection.setConnectTimeout(5000); // 5秒 连接主机的超时时间(单位:毫秒)

    3. connection.setReadTimeout(5000); // 5秒 从主机读取数据的超时时间(单位:毫秒)

    参考:https://blog.csdn.net/jackson_wen/article/details/51923514

     

    • ConnectTimeout

      指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
      java中,网络状况正常的情况下,例如使用HttpClient或者HttpURLConnetion连接时设置参数connectTimeout=5000即5秒,如果连接用时超过5秒就是抛出java.net.SocketException: connetct time out的异常
    • ReadTimeout

      指的是建立连接后从服务器读取到可用资源所用的时间。
      在这里我们可以这样理解ReadTimeout:正常情况下,当我们发出请求时可以收到请求的结果,也就是页面上展示的内容,但是当网络状况很差的时候,就会出现页面上无法展示出内容的情况。另外当我们使用爬虫或者其他全自动的程序时,无法判断当前的网络状况是否良好,此时就有了ReadTimeout的用武之地了,通过设置ReadTimeout参数,例:ReadTimeout=5000,超过5秒没有读取到内容时,就认为此次读取不到内容并抛出Java.net.SocketException: read time out的异常。
      根据上面关于ConnectTimeout和ReadTimeout的描述,在我们使用需要设置这两项参数的服务或程序时,应该对两项参数一起设置。

    一般而言两项参数的数值可以设置成一样的,但根据笔者个人经验,可以把ReadTimeout设置的长一点,ConnectTimeout可以相对比较短,这是源于我们的网络状况一般较为稳定,连接时很少出现问题,但是读取时因为数据下载时的网络波动,出状况的可能性更大一些。

     

    httpclient超时时间

    说明

    ConnectionRequestTimeout

    httpclient使用连接池来管理连接,这个时间就是从连接池获取连接的超时时间,可以想象下数据库连接池

    ConnectTimeout

    连接建立时间,三次握手完成时间

    SocketTimeout

    数据传输过程中数据包之间间隔的最大时间

    下面重点说下SocketTimeout,比如有如下图所示的http请求

    这里写图片描述

    虽然报文(“abc”)返回总共用了6秒,如果SocketTimeout设置成4秒,实际程序执行的时候是不会抛出java.net.SocketTimeoutException: Read timed out异常的。

    因为SocketTimeout的值表示的是“a”、”b”、”c”这三个报文,每两个相邻的报文的间隔时间不能超过SocketTimeout

     

    展开全文
  • 一看代码,果然漏了setReadTimeout。。。。。OMG 。。。 3、解决方案 同时设置这两个超时时间: HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); urlCon.setConnectTimeout(201000); urlCon....

    1、问题描述

    这几天测试重构后的下载框架,发现在下载过程中如果网络中断或网络较差,个别应用的下载就会阻塞卡住,一直卡在 “正在下载 xx%”。

    2、问题排查和定位

    思考:网络差不应该报网络异常的错误或者直接抛timeout异常吗?所以马上去检查Http请求的地方:发现在DownloadThread中使用HttpURLConnection进行网络请求时只是设置了connectTimeout,这样在建立连接的时候如果网络中断,那么超时以后就会报出错误,这里是没有问题的。会不会是还少设置了其他参数的原因呢?

    于是赶紧去查阅资料:
    ConnectTimeout只有在网络正常的情况下才有效,而当网络不正常时,ReadTimeout才真正的起作用,即IdIOHandlerStack 里的 WaitFor 是受ReadTimeout限制的,因此,这2个属性应该结合实用。

    connect timeout 是建立连接的超时时间;
    read timeout,是传递数据的超时时间。

    正确的方法应当是调用HttpURLConnection的时候同时设置这两个超时时间。
    一看代码,果然漏了setReadTimeout。。。。。OMG 。。。

    3、解决方案

    同时设置这两个超时时间:
    HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
    urlCon.setConnectTimeout(201000);
    urlCon.setReadTimeout(20
    1000);

    参考连接:https://blog.csdn.net/jackson_wen/article/details/51923514

    展开全文
  • setConnectTimeout,setReadTimeout

    千次阅读 2014-11-06 15:35:58
    setReadTimeout:设置从主机读取数据超时(单位:毫秒) 例如: HttpURLConnection urlCon = (HttpURLConnection)url.openConnection(); urlCon.setConnectTimeout(30000); urlCon.setReadTimeou
  • 为什么要给URLConnection对象使用setConnectionTimeout和SetReadTimeout? 比如setConnectionTimeout会在读取超过设置的时间的情况下报错,我不设置又有啥关系?会出线啥问题呢?使用这两个方法主要是为什么考虑呢...
  • <pre><code>Connection.SetReadTimeout undefined (type *net.TCPConn has no field or method SetReadTimeout) </code></pre> <p>I guess the <a href="http://golang.org/pkg/net/#TCPConn.SetReadTimeout" rel=...
  • this.setReadTimeout(readTimeout); this.setConnectTimeout(connectionTimeout); } private boolean isXYZTransaction(URI uri){ try { URI XYZUrl = new URI(XYZSystemUrl); logger.info("######################...
  • httpRequestFactory.setReadTimeout(3000); return new RestTemplate(httpRequestFactory); } } 配置文件指定 custom.rest.connection.connection-request-timeout=3000 custom.rest.connection.connect-timeout=...
  • factory.setReadTimeout(this.readTimeout); return factory; } HttpClient httpClient = HttpClientBuilder.create().setMaxConnTotal(this.maxTotalConnect).setMaxConnPerRoute(this.maxConnectPerRoute).build...
  • = null) { okHttpClient.setReadTimeout(readTimeout.getValue(), readTimeout.getUnit()); } OkHttpProperties.Timeout writeTimeout = properties.getWriteTimeout(); if (writeTimeout != null) { okHttpClient....
  • resttemplate设置超时

    千次阅读 2020-02-11 18:25:41
    setReadTimeout 设定读取超时。连接建立后,发起request到收到response的时间。这个要慎重,如果你设置了超时,上游最后又把数据response给你了,可能出现你和上游的数据不一致。 restTemplateBuilder方式已经被废弃...
  • connectTimeOut和readTimeout

    2021-02-26 12:33:49
    (Unknown Source) 通过 URLConnection setReadTimeout 可以设置指定的值。0则指极大值。 conn = url.openConnection(); conn.setReadTimeout(20000); 类似的设置在很多软件都基本相同的,比如 wget. -T, --timeout=...
  • factory.setReadTimeout(15000); factory.setConnectTimeout(3000); RestTemplate restTemplate = new RestTemplate(factory); List interceptors = new ArrayList(); //添加自定义拦截器...
  • // requestFactory.setReadTimeout(10000); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setConnectionRequestTimeout(5000); ...
  • RestTemplate 超时值

    千次阅读 2021-07-01 16:42:21
    } } 其 setConnectTimeout 和 setReadTimeout 方法,且默认值为 -1。 设置超时时间: SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(60000); ...
  • spring默认已经注入了RestTemplateBuilder实例 @Bean public RestTemplate restTemplate() { return builder.setConnectTimeout(Duration.ofMillis(connectTimeout)).setReadTimeout(Duration.ofMillis(readTimeout)...
  • factory.setReadTimeout(10000);//单位为ms factory.setConnectTimeout(5000);//单位为ms return factory; } /** * 注入封装RestTemplate * @Title: httpRequestUtils * @return httpRequestUtils */ @...
  • 使用getResponseCode()方法超时了却阻塞了线程,原因是指设置了setConnectTimeout没有设置setReadTimeout参数导致的 setConnectTimeout:设置连接主机超时(单位:毫秒) setReadTimeout:设置从主机读取数据...
  • 首先可以建一个公共类RestTemplateConfiguration @Bean public RestTemplate restTemplate() { ... factory.setReadTimeout(10000); factory.setConnectTimeout(10000); return new Rest
  • ConnectTimeout 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。 在java中,网络状况正常的情况下,例如使用 HttpClient 或者 HttpURLConnetion 连接时设置参数 connectTimeout=5000 ...
  • springboot设置请求超时

    万次阅读 2020-06-18 16:15:31
    // 连接到主机 超时时间 factory.setReadTimeout(10000); // 从主机读取数据 超时时间 return factory; } 配置文件设置超时时间 yml写法: rest: template: conn: connect-timeout: 3000 read-timeout: 3000 ...
  • 在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法: setConnectTimeout:设置连接主机超时(单位:毫秒) setReadTimeout:设置从主机读取数据超时(单位:毫秒) 例如: HttpURLConnection ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,998
精华内容 8,799
关键字:

setreadtimeout