模拟java.net.ConnectException:连接时间

时间:2015-07-09 09:44:53

标签: java http networking network-programming apache-commons-httpclient

我想在我的java应用程序中人为地创建一个连接超时来测试我的连接超时处理。我看过这个帖子Artificially create a connection timeout error

但是当我尝试建议的内容如http://10.255.255.1http://www.google.com:81时,我正在使用的lib进行http调用(Apache http client 3.1)给了我连接拒绝异常而不是超时。

[9/07/15 19:28:45:000 EST] 00000088 SystemErr     R IOException Connection refused: connect
[9/07/15 19:28:46:188 EST] 00000088 SystemErr     R java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:336)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:201)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:188)
    at java.net.Socket.connect(Socket.java:478)
    at sun.reflect.GeneratedMethodAccessor187.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
    at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
    at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
    at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
    at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)

有人可以一起推荐我可以调整的内容或不同的建议,以便让我测试连接超时吗?

修改

以下是我要测试的代码....

    HttpClient client = new HttpClient();           
    HttpConnectionManagerParams httpConnectionManagerParams = client.getHttpConnectionManager().getParams();        
    httpConnectionManagerParams.setConnectionTimeout(45000);
    httpConnectionManagerParams.setSoTimeout(45000);
    httpConnectionManagerParams.setTcpNoDelay(false);

    // Create a method instance.
    GetMethod method = new GetMethod(url);
    HttpMethodParams httpMethodParams = method.getParams();

    // no retries
    httpMethodParams.setParameter(
            HttpMethodParams.RETRY_HANDLER,
            new DefaultHttpMethodRetryHandler(0, false));
    httpMethodParams.setSoTimeout(45000);

    try {
        // Execute the method.  
        int statusCode = client.executeMethod(method);      

        // Read the response body.
        byte[] responseBody = method.getResponseBody();
        jsonResponse = new String(
                new String(responseBody).getBytes(JsonConstants.DEFAULT_CHARSET), JsonConstants.DEFAULT_CHARSET);

    } catch (HttpException e) {
        System.err.println("HttpException " + e.getMessage());  
        e.printStackTrace();

    } catch (IOException e) {
        System.err.println("IOException " + e.getMessage());
        e.printStackTrace();

    } finally {
        // Release the connection.
        method.releaseConnection();
    }

感谢

2 个答案:

答案 0 :(得分:1)

为什么不使用模拟测试?恕我直言,它是最好的模拟工具之一:JMockit。您可以模拟,例如HttpClient类并抛出connectionTimeOutException(或者您真正需要测试代码的任何内容)。

我仍然不清楚,当您发送超时时,会发生什么。它会抛出异常吗?你的代码在发生时如何识别它?

请看一下。如果你需要进一步的帮助,请给我一个喊叫=]

答案 1 :(得分:0)

  

允许我测试连接超时?

您可以使用Sniffy来模拟网络延迟 - 它与Java TCP堆栈无缝集成,不需要从应用程序端进行任何更改。请参阅documentation on emulating network issues

支持两种方案:添加延迟和模拟连接超时异常(延迟后抛出)和其他套接字异常(立即抛出)

demo.sniffy.io提供在线演示 - 点击右下角的小部件,转到“网络连接”标签,然后将延迟设置为1000毫秒对于 en.wikipedia.org 。刷新浏览器页面,您将看到加载页面需要1秒钟。 javaagent integration也可用于非Web应用程序。

enter image description here

免责声明:我是Sniffy

的作者