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

Posted

技术标签:

【中文标题】模拟 java.net.ConnectException:连接超时【英文标题】:Simulate java.net.ConnectException: Connection timout 【发布时间】:2015-09-27 14:46:41 【问题描述】:

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

但是当我尝试诸如http://10.255.255.1 或http://www.google.com:81 之类的建议时,我用来进行http 调用(Apache http 客户端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();
    

谢谢

【问题讨论】:

是否可以向我们展示您想要测试的代码部分? 添加了我正在尝试测试的代码 sn-p 除非您有一个 IP 地址为 10.255.2555.1 的主机,否则您无法从 10.255.255.1 获得“连接被拒绝”,在这种情况下,解决方案是使用您在该子网中的 IP 地址没有。 @Richie 请看我的回答。 我的意思是,如果你在那个子网中并且没有这样的主机,你就无法得到它。您将获得连接超时。您使用的客户端与它无关,只要它正确报告错误即可。 【参考方案1】:

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

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

请看一下。如果您需要进一步的帮助,请大声告诉我 =]

【讨论】:

在 vatch 块中我抛出了一个异常,但我删除了它,因为它是一个包含我公司名称的异常。感谢您对 JMockit 的建议。我去看看。 @Richie 很高兴为您提供帮助。如果您需要帮助,请大声告诉我。自从我上次玩它已经有一段时间了,但这可能是一个很好的借口来刷新我的记忆。干杯。【参考方案2】:

允许我测试连接超时?

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

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

demo.sniffy.io 提供在线演示 - 单击右下角的小部件,转到 “网络连接” 选项卡并设置 延迟 为 1000 毫秒 en.wikipedia.org。刷新浏览器页面,您会看到加载页面需要多花 1 秒时间。 javaagent integration 也可用于非 Web 应用程序。

免责声明:我是Sniffy的作者

【讨论】:

以上是关于模拟 java.net.ConnectException:连接超时的主要内容,如果未能解决你的问题,请参考以下文章

按键精灵--设置模拟方式

iPhone模拟器和Android模拟器之间的区别

返回另一个模拟类的模拟模拟类

Arduino提供多少个模拟接口,模拟信号的分辨率为多少位?

各模拟器adb连接端口

selenium如何模拟真实键盘操作?