Napisałem program, który otwiera httpurlconnection do strony internetowej poprzez losowe proxy. Mój httpurlconnection nazywa się conn. Teraz wiem, że niektóre z tych serwerów proxy mogą być zbyt wolne, więc ustawiłem limit czasu połączenia na 40000 milisekund z conn.setConnectTimeout(40000)
i conn.setReadTimeout(40000)
.Limit czasu HTTPUrlConnection Java nie działa
Po robią tak, mam ten kod:
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();
}
Istnieją powody, dla których połączenie może zawodzić, więc w wielu przypadkach i dostać się do ostatniego bloku catch i pojawia się następujący komunikat:
Wiadomość: Connection timed out: connect MyTimeout: 40000 Rzeczywisty czas przeszły: 21012
Wiadomość: Connection timed out: connect MyTimeout: 40000 Rzeczywisty czas przeszły: 21016
Wiadomość: Connection timed out: connect MyTimeout: 40000 Rzeczywisty czas przeszły: 21010
Wiadomość: Connection timed out: connect MyTimeout: 40000 Rzeczywisty czas przeszły: 21009
Więc moje pytanie byłoby : Ustawiłem limit czasu na 40000 milisekund, ale dostaję odpowiedź "Limit czasu połączenia" po około 21000 milisekund, czy ktoś z was wie, dlaczego tak jest?
EDYCJA: im przy użyciu systemu Windows 7 i teraz dodałem e.printStackTrace() do catch-bloku, jak powiedział w komentarzach. dzięki jak dotąd. wyjście jest teraz (przykład):
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
wyjście i proszę pisać rzeczywisty ślad stosu zamiast własnych wiadomości. –
może to być zależne od systemu operacyjnego, proszę określić, który system operacyjny jest tym –
Jak wspomniano przez Briana Roacha, proszę opublikować wyjście z 'e.printStackTrace()' w bloku catch. –