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不会影响套接字