Java URLConnection超时
我正在尝试从HTTP URLparsingXML文件。 我想要configuration15秒的超时如果XML获取需要更长的时间,我想报告超时。 出于某种原因,setConnectTimeout和setReadTimeout不起作用。 代码如下:
URL url = new URL("http://www.myurl.com/sample.xml"); URLConnection urlConn = url.openConnection(); urlConn.setConnectTimeout(15000); urlConn.setReadTimeout(15000); urlConn.setAllowUserInteraction(false); urlConn.setDoOutput(true); InputStream inStream = urlConn.getInputStream(); InputSource input = new InputSource(inStream);
我正在捕捉SocketTimeoutException。
谢谢Chris
尝试这个:
import java.net.HttpURLConnection; URL url = new URL("http://www.myurl.com/sample.xml"); HttpURLConnection huc = (HttpURLConnection) url.openConnection(); HttpURLConnection.setFollowRedirects(false); huc.setConnectTimeout(15 * 1000); huc.setRequestMethod("GET"); huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); huc.connect(); InputStream input = huc.getInputStream();
要么
import org.jsoup.nodes.Document; Document doc = null; try { doc = Jsoup.connect("http://www.myurl.com/sample.xml").get(); } catch (Exception e) { //log error }
并看看如何使用Jsoup: http ://jsoup.org/cookbook/input/load-document-from-url
您可以通过线程睡眠手动强制断开连接。 这是一个例子:
URLConnection con = url.openConnection(); con.setConnectTimeout(5000); con.setReadTimeout(5000); new Thread(new InterruptThread(con)).start();
然后
public class InterruptThread implements Runnable { HttpURLConnection con; public InterruptThread(HttpURLConnection con) { this.con = con; } public void run() { try { Thread.sleep(5000); // or Thread.sleep(con.getConnectTimeout()) } catch (InterruptedException e) { } con.disconnect(); System.out.println("Timer thread forcing to quit connection"); } }
我使用类似的代码从服务器下载日志。 我debugging我的代码,发现返回的URLConnection的实现是sun.net.www.protocol.http.HttpURLConnection。
抽象类java.net.URLConnection有两个属性connectTimeout和readTimeout,并且setter在抽象类中。 相信或不执行sun.net.www.protocol.http.HttpURLConnection具有相同的属性connectTimeout和readTimeout,没有setter和实现类的属性在getInputStream方法中使用。 所以没有使用connectTimeout和readTimeout,因为它们在getInputStream方法中从不使用。 在我看来这是sun.net.www.protocol.http.HttpURLConnection实现中的错误。
我的解决scheme是使用HttpClient和Get请求。
您可以通过更改以下系统属性来为从jvm创build的所有连接设置超时:
System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000");
每个连接将在10秒后超时。
设置'defaultReadTimeout'是不需要的,但是如果你需要控制阅读的话就是一个例子。
你在Windows上吗? Windows上的底层套接字实现似乎不能很好地支持SO_TIMEOUT选项。 另请参阅此答案: 客户端套接字上的setSoTimeout不会影响套接字