簡體   English   中英

如何根據Java中的URLConnection對BufferedReader設置超時?

[英]How can I set a timeout against a BufferedReader based upon a URLConnection in Java?

我想讀取URL的內容,但如果URL沒有響應則不想“掛起”。 我使用URL創建了一個BufferedReader ...

URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

...然后開始循環閱讀內容......

do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\n");
        }
    }
while (buf != null);

...但如果讀取掛起,則應用程序掛起。

有沒有辦法,如果沒有將代碼磨到套接字級別,必要時“超時”讀取?

我認為URLConnection.setReadTimeout就是你要找的東西。

如果你有java 1.4:

我假設連接超時( URLConnection.setConnectTimeout(int timeout) )是沒有用的,因為你正在做某種流式傳輸。

--- 不要殺死線程 ---可能會導致未知問題,打開描述符等。

生成java.util.TimerTask,您將檢查是否已完成該過程,否則,關閉URLConnection的BufferedReader和OutputStream

插入一個布爾標志isFinished並在循環結束時將其設置為true,並在循環之前將其設置為false

TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

這可能會導致ioexception,所以你必須抓住它。 這個例外本身並不是一件壞事。 我省略了一些聲明(即決賽),所以匿名類可以訪問你的變量。 如果沒有,則創建一個維護引用的POJO並將其傳遞給timertask

從Java 1.5開始,可以通過URLConnection類上的'setReadTimeout(int timeout)'方法在底層套接字上設置讀取超時(以毫秒為單位)。

請注意,還存在'setConnectTimeout(int timeout)',它將對遠程服務器的初始連接執行相同的操作,因此設置它也很重要。

對於Java 1.4,您可以使用Apache的SimpleHttpConnectionManager.getConnectionWithTimeout(hostConf,CONNECTION_TIMEOUT)

我最近剛剛在JVM 1.4環境中研究過這個問題。 庫存答案是使用系統屬性sun.net.client.defaultReadTimeout(讀取超時)和/或sun.net.client.defaultConnectTimeout。 這些在Networking Properties中記錄 ,可以通過Java命令行上的-D參數或通過System.setProperty方法調用進行設置。

據推測,這些都是由實現緩存的,所以你不能將它們從一個東西改為另一個東西,所以一次使用它們,值就會被保留。

此外,它們並不適用於SSL連接和HttpsURLConnection。 還有其他方法可以使用自定義SSLSocketFactory來處理它。

同樣,所有這些都適用於JVM 1.4.x. 在1.5及以上,您可以在API中使用更多方法(如上面其他響應者所述)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM