URLConnection不尊重ReadTimeout

时间:2013-12-17 12:26:54

标签: java android

我在代码中使用URLConnection。我已将ReadTimeout设置为5秒,但它并未生效。当我关闭wifi时,IO Exception正在被立即调用。

 URLConnection conn;     
 conn = new URL(StringUrls[0]).openConnection();
 conn.setReadTimeout(5000);
 in = conn.getInputStream();


      try {
           len = in.read(buffer);
           bufOutstream.write(buffer, 0, len);
           bufOutstream.close();
         } catch (IOException e1) {
             e1.printStackTrace();
                        }

IO异常:

12-17 12:41:35.332  12761-13268/com.app.example W/System.err﹕ java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out)
12-17 12:41:35.362  12761-13268/com.app.example W/System.err﹕ at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:542)
12-17 12:41:35.362  12761-13268/com.app.example W/System.err﹕ at libcore.io.IoBridge.recvfrom(IoBridge.java:506)
12-17 12:41:35.362  12761-13268/com.app.example W/System.err﹕ at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
12-17 12:41:35.362  12761-13268/com.app.example W/System.err﹕ at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
12-17 12:41:35.362  12761-13268/com.app.example W/System.err﹕ at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
12-17 12:41:35.362  12761-13268/com.app.example W/System.err﹕ at java.io.BufferedInputStream.read(BufferedInputStream.java:304)
12-17 12:41:35.362  12761-13268/com.app.example W/System.err﹕ at libcore.net.http.UnknownLengthHttpInputStream.read(UnknownLengthHttpInputStream.java:41)
12-17 12:41:35.362  12761-13268/com.app.example W/System.err﹕ at java.io.InputStream.read(InputStream.java:163)

3 个答案:

答案 0 :(得分:1)

示例代码为打击,

它会尝试最多20次来读取正确的数据。

如果一次发生异常,则只需在5秒后重试。

private static int currentRetryCount = 0;

public static void main(String[] args) throws InterruptedException {
    retryRead(20);
}

public static void retryRead(int maxRetryCount) throws InterruptedException {
    if (currentRetryCount <= maxRetryCount) {
        try {
            System.out.println("try count " + currentRetryCount);
            URLConnection conn;
            conn = new URL("").openConnection();
            conn.setReadTimeout(5000);
            conn.getInputStream();
            // if nothing happens,it just return
            return;
        } catch (Exception e) {
            // if exception raises,it will try again after 5 seconds
            Thread.sleep(5000);

            currentRetryCount++;
            retryRead(maxRetryCount);
        }
    }
}

答案 1 :(得分:0)

也许您正在寻找setConnectTimeout

connectTimeout是建立连接的超时时间。
readTimeout是在建立连接后从输入流中读取数据的超时。

此外,当您的Wifi关闭时立即获得IOException的原因是,如果您没有活动的连接媒体,连接将立即中止而不管超时。

答案 2 :(得分:0)

您想要什么效果?您能否显示更多详细信息?

将ReadTimeOut设置为N秒,并不意味着总读取时间将小于N秒。

这意味着两个数据包之间的最长时间(通过连接,您将获得大量数据包)。

例如,如果在N秒内没有可用数据,则会引发SocketTimeoutException。