Ich habe ein Programm geschrieben, das eine httpurlconnection zu einer Website durch zufällige Proxys öffnet. Meine httpurlconnection heißt conn. Jetzt weiß ich, dass einige dieser Proxies möglicherweise zu langsam sind, also habe ich das Timeout der Verbindung auf 40000 Millisekunden mit conn.setConnectTimeout(40000)
und conn.setReadTimeout(40000)
gesetzt.Java HTTPUrlConnection Timeout funktioniert nicht
Nach so tun, ich erhielt diesen Code:
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();
}
Es gibt Gründe, warum die Verbindung fehlschlagen könnte, also in vielen Fällen i bis zum letzten catch-Block erhalten und die folgende Ausgabe:
Nachricht: Connection timed out: connect MyTimeout: 40000 Tatsächliche Zeit vergangen: 21012
Nachricht: Connection timed out: connect MyTimeout: 40000 Tatsächliche Zeit vergangen: 21016
Nachricht: Connection timed out: connect MyTimeout: 40000 Tatsächliche Zeit vergangen: 21010
Nachricht: Connection timed out: connect MyTimeout: 40000 Tatsächliche Zeit vergangen: 21009
Also meine Frage wäre : Ich habe das Timeout auf 40000 Millisekunden eingestellt, aber ich bekomme eine "Connection Timeout" -Antwort nach etwa 21000 Millisekunden, weiß jemand von euch, warum das ist?
EDIT: ich benutze Windows 7 und ich habe jetzt e.printStackTrace() zum catch-block hinzugefügt, wie in den Kommentaren erzählt. Danke bis jetzt. Die Ausgabe ist jetzt (Beispiel):
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
Bitte Ausgabe und poste den tatsächlichen Stack-Trace statt Ihrer eigenen Mitteilung. –
Dies könnte Betriebssystemabhängig sein, bitte geben Sie an, welches Betriebssystem das ist –
Wie von Brian Roach erwähnt, posten Sie bitte die Ausgabe von 'e.printStackTrace()' im catch-Block. –