2011-11-18 29 views
1

我有問題,當服務器沒有響應時,我從來沒有得到SocketTimeOutException。 30秒後,我得到一個IOException。如果服務器沒有響應,則超時不起作用

當服務器沒有響應時,我需要做些什麼來獲得超時?

這是我的代碼,其中第一個URL工作,第二個結果在IOException而不是SocketTimeOutException。

公共類TestConnection {

public static final int TIMEOUT_VALUE = 5000; 

public static void main(String[] arg){ 

    try { 
     URL testUrl = new URL("http://www.doublegames.com/images/games140/scrabble-cubes-online_140x140.jpg"); 
     testTimeOut(testUrl); 
     testUrl = new URL("http://tamblang.co.cc/wp-content/uploads/2010/08/cd7ce2_command-038-conquer-4-tiberian-twilight-140x140.jpg"); 
     testTimeOut(testUrl); 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
} 
private static void testTimeOut(URL testUrl) { 
    try { 
     long start = System.nanoTime(); 
     HttpURLConnection testConnection = (HttpURLConnection) testUrl.openConnection(); 
     testConnection.setConnectTimeout(TIMEOUT_VALUE); 
     testConnection.setReadTimeout(TIMEOUT_VALUE); 


     BufferedReader in = new BufferedReader(new InputStreamReader(testConnection.getInputStream())); 
     long elapsed = System.nanoTime() - start; 
     System.out.println("Elapsed (ms): " + elapsed/1000000); 
     System.out.println("Connection worked for " + testUrl); 
    } catch (SocketTimeoutException e) { 
     System.out.println("More than " + TIMEOUT_VALUE + " elapsed." + testUrl); 
    } catch(IOException ioe){ 
     System.out.println("No timeout for " + testUrl); 
    } 
} 

}

我也試圖與阿帕奇HttpClient的,但同樣的事情出現。

private static void testTimeOut(URL testUrl) { 
    long start = 0; 
    try { 
     start = System.nanoTime(); 

     HttpParams httpParams = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_VALUE); 
     HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_VALUE); 
     HttpClient httpClient = new DefaultHttpClient(httpParams); 

     HttpGet httpget = new HttpGet(testUrl.toString()); 
     HttpResponse response = httpClient.execute(httpget); 


     // Get hold of the response entity 
     HttpEntity entity = response.getEntity(); 

     // If the response does not enclose an entity, there is no need 
     // to bother about connection release 
     if (entity != null) { 
      InputStream instream = entity.getContent(); 
       BufferedReader in = new BufferedReader(new InputStreamReader(instream)); 
       // do something useful with the response 
       long elapsed = System.nanoTime() - start; 
       System.out.println("Elapsed (ms): " + elapsed/1000000); 
       System.out.println("Connection worked for " + testUrl); 

      } 
    }catch(Exception e){ 
     long elapsed = System.nanoTime() - start; 
     System.out.println("Elapsed (ms): " + elapsed/1000000); 
     System.out.println("No timeout for " + testUrl + " after " + elapsed/100000); 
    } 
} 
+1

你可以添加以下到IOException異常陷阱:'通信System.err.println(e.getMessage()); e.printStackTrace();' – Bringer128

+0

「第二次導致IOException」。 *什麼* IOException?永遠不會記錄或打印異常。 – EJP

+0

的java.net.UnknownHostException:tamblang.co.cc \t在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195) \t在java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432) \t在java的.net.Socket.connect(Socket.java:529) \t at sun.net.NetworkClient.doConnect(NetworkClient.java:158) – Patrik

回答

0

你試圖打開通過testUrl.openConnection()連接,其中testUrlURL類型。那麼,如果你看看具體javadoc,你會注意到URL.openConnection()永遠不會拋出SocketTimeoutException。它只能拋出一個IOException

+0

FYI'SocketTimeoutException'從'IOException'延伸。拋出'SocketTimeoutException'的大多數Java代碼僅被記錄爲'IOException'。 – Bringer128

+0

無論我得到什麼異常都無所謂,我試圖實現的目標是在5秒鐘後超時。 – Patrik

0

可以趕上IOException異常,並在catch塊

+0

是的,但我想超時5秒後,導致一個SocketTimeOutException,現在我30秒後得到一個IOException。 – Patrik

+0

你可以啓動一個線程/定時器併爲它添加一個監聽器。 當它在5秒後過期時,你可以拋出SocketTimeOutException –

+0

我認爲這聽起來像是最好的解決方案,不能以任何其他方式解決它。你有任何代碼示例?我正在考慮執行者/未來解決方案。 – Patrik

0
  1. 連接對象是通過調用一個URL的openConnection方法創建拋出一個新的SocketTimeOutException。
  2. 操作設置參數和一般請求屬性。
  3. 使用連接方法建立到遠程對象的實際連接。
  4. 遠程對象變爲可用。可以訪問標題字段和遠程對象的內容。
相關問題