我在代码中使用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)
答案 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。