如果服务器不响应,超时不起作用



我有一个问题,我从来没有得到一个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);
    }
}

}

我也尝试过与apaches 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);
    }
}

您试图通过testUrl.openConnection()打开连接,其中testUrlURL类型。如果您看一下特定的javadoc,就会注意到URL.openConnection()永远不会抛出SocketTimeoutException。它只能抛出一个IOException

你可以捕获IOException并在catch块中抛出一个新的SocketTimeOutException

  1. 通过调用URL上的openConnection方法创建连接对象。
  2. 设置参数和一般请求属性被操纵。
  3. 使用connect方法与远程对象建立实际连接。
  4. 远程对象可用。可以访问报头字段和远程对象的内容。

相关内容

  • 没有找到相关文章

最新更新