Manchmal HttpURLConnection.getInputStream führt zu langsam
Wir haben nächsten code.
Manchmal sollten wir warten, 10-20-40 Sekunden auf der letzten Zeile.
Was kann das problem sein?
Java 1.4
URL url = ...;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.connect();
OutputStream out = conn.getOutputStream();
ObjectOutputStream outStream = new ObjectOutputStream(out);
try
{
outStream.writeObject(objArray);
}
finally
{
outStream.close();
}
InputStream input = conn.getInputStream();
AKTUALISIERT:
Folgender code behebt das problem IN ECLIPSE.
Aber es FUNKTIONIERT immer noch NICHT via Java WebStart:(
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
System.setProperty("http.keepAlive", "false"); //<---------------
conn.connect();
Aber warum?
AKTUALISIERT noch eine Zeit!
Bug behoben wurde! 🙂
Wir arbeiteten mit verbindungen, die nicht in einer Klasse, aber in zwei.
Und dort ist folgende Zeile in der zweiten Klasse:
URL url = ...
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Length", "1000"); //<------------
conn.connect();
Hinweis:
setRequestProperty("Content-Length", "1000")
ist Ursache des Problems.
- Warum ist openConnection zweimal aufgerufen?
- Es ist nur Druckfehler. Korrigiert.
- Warum ist Content-Length das Problem, eh?
Du musst angemeldet sein, um einen Kommentar abzugeben.
'Wir hatten ein ähnliches Problem, verursacht durch buggy keep-alive im alten Java. Fügen Sie diese vor dem schließen, um zu sehen, ob es hilft,
oder
connection=close
header funktionieren sollte. Vielleicht haben Sie nicht setzen Sie die request-Eigenschaft richtig. Es sollte vorconnect()
. Einstellung der system-propertyhttp.keepalive=false
tut im Grunde das gleiche, aber dann als low-level-workaround. Wenn nicht manuell angegeben, dieURLConnection
es verwendet, um dieconnection
header. Dass es nicht funktioniert in webstart ist einfach eine Sicherheitsmaßnahme. Aber egal, dassetRequestProperty("Connection", "close")
arbeiten müssen. Versuchen Sie es erneut und überprüfen Sie, wenn Sie Taten alles, was Recht ist.Hatte das gleiche problem, fand heraus, es war verursacht durch IPv6.
Deaktivieren Sie es aus dem code verwenden:
Können Sie auch deaktivieren Sie es über die Kommandozeile mit :
g-Djava.net.preferIPv4Stack=true
Versuchen Sie es mit einer IP-Adresse. Um zu sehen, ob es ein DNS-problem.
Ich hatte das gleiche problem, so dass ich ändern, um HTTPClient von Apache, Folgen ein Beispiel:
Das problem kann etwas sein, das von Netzwerk-sub-Schicht... Sollte schwer zu finden.
Aber was ist mit den
setReadTimeOut()
mit niedrigem Wert und eine while-Schleife?Eine Sache, die ich denke, ist, dass Ihr DNS-server nicht gut reagiert.
Können Sie Experimentieren mit wechselnden symbolische domain-Namen in numerische IP-Adressen, bevor Sie beginnen? Oder können Sie tun, jede Anfrage zweimal (nur für versuche) und sehen, ob die erste Anforderung ist deutlich langsamer als die zweite?
Google hat einen DNS-server an (unter anderem) 8.8.8.8 . Sie behaupten, es ist schneller als die meisten anderen DNS-Servern. Probieren!