【发布时间】:2012-12-11 03:55:45
【问题描述】:
我编写了一个程序,它通过随机代理打开到网站的 httpurl 连接。我的 httpurlconnection 称为 conn。现在我知道,其中一些代理可能太慢了,所以我使用conn.setConnectTimeout(40000) 和conn.setReadTimeout(40000) 将连接超时设置为 40000 毫秒。
这样做之后,我得到了这个代码:
long diff = 0;
long starttime = 0;
long endtime = 0;
try
{
starttime = System.currentTimeMillis();
conn.connect();
endtime = System.currentTimeMillis();
diff = endtime - starttime;
if (endtime <= starttime + conn.getConnectTimeout())
{
//Trying to read sourecode
InputStreamReader isrConn = new InputStreamReader(conn.getInputStream());
BufferedReader brConn = new BufferedReader(isrConn);
line = brConn.readLine();
while (line != null)
{
response += line + "\t";
try
{
line = brConn.readLine();
} catch (IOException e)
{
printError("Reading sourcecode failed.");
}
}
}
else
{
response = "blabla.";
}
// If conn.connect failed
} catch (IOException e)
{
endtime = System.currentTimeMillis();
diff = endtime - starttime;
response = "Message: "+e.getMessage() +" MyTimeout:"+ conn.getConnectTimeout() +" Actual time passed: "+ diff;
e.printStackTrace();
}
连接失败是有原因的,所以在很多情况下,我会到达最后一个 catch-block 并得到以下输出:
消息:连接超时:连接 MyTimeout:40000 实际经过时间:21012
消息:连接超时:连接 MyTimeout:40000 实际时间已过:21016
消息:连接超时:连接 MyTimeout:40000 实际经过时间:21010
消息:连接超时:连接 MyTimeout:40000 实际经过时间:21009
所以我的问题是:我已将超时设置为 40000 毫秒,但我在大约 21000 毫秒后收到“连接超时”响应,你们中有人知道这是为什么吗?
编辑:我正在使用 Windows 7,我现在将 e.printStackTrace() 添加到 catch-block 中,就像在 cmets 中所说的那样。谢谢到目前为止。现在的输出是(示例):
java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient$1.run(Unknown Source)
at sun.net.www.http.HttpClient$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.http.HttpClient.privilegedOpenServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.<init>(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at TestThread.getSourcePage(TestThread.java:361)
at TestThread.aChecker(TestThread.java:216)
at TestThread.getNextProxy(TestThread.java:169)
at TestThread.getNextC(TestThread.java:157)
at TestThread.aChecker(TestThread.java:273)
at TestThread.getNextProxy(TestThread.java:169)
at TestThread.aChecker(TestThread.java:295)
at TestThread.getNextProxy(TestThread.java:169)
at TestThread.getNextC(TestThread.java:157)
at TestThread.run(TestThread.java:103)
at java.lang.Thread.run(Unknown Source)
Message: Connection timed out: connect MyTimeout:40000 Actual time passed: 21015
【问题讨论】:
-
请输出并发布实际的堆栈跟踪,而不是您自己的消息。
-
这可能取决于操作系统,请说明是哪个操作系统
-
正如 Brian Roach 所说,请将
e.printStackTrace()的输出发布到 catch 块中。 -
添加了您所说的内容。我希望你能进一步帮助我,在此先感谢。
-
21 秒是因为 windows:superuser.com/questions/339959/…(这些值也与 Windows 7 中使用的值相同)。请注意,通常当您设置连接超时时,是因为您希望在比系统默认值更短的时间内超时。
标签: java timeout httpurlconnection urlconnection