【发布时间】: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 请看我的回答。
-
我的意思是,如果你在那个子网中并且没有这样的主机,你就无法得到它。您将获得连接超时。您使用的客户端与它无关,只要它正确报告错误即可。
标签: java http networking network-programming apache-commons-httpclient