HttpUrlConnection.openConnection zawodzi po raz drugi

Wiem, że ten problem powinien zostać rozwiązany w systemie.setProperty ("http.keepAlive", "false"); przed openConnection, ale mi to nie wyszło. Pierwsza próba na tym kodzie działa, druga nie. Nawet jeśli spróbuję tego żądania po mniej niż 5 sekundach, to również działa. Jeśli poczekam więcej niż to, to znowu się nie powiedzie

To jest mój kod:

    System.setProperty("http.keepAlive", "false");
  HttpURLConnection conn = (HttpURLConnection) mURL.openConnection();
  conn.setUseCaches(false); 
  conn.setRequestProperty("Connection","Keep-Alive"); 
  conn.setRequestProperty("User-Agent", useragent);
  conn.setConnectTimeout (30000) ; 
  conn.setDoOutput(true); 
        conn.setDoInput(true); 

  consumer.sign(conn);
  InputSource is = new InputSource(conn.getInputStream());

Dostaję wyjątek w ostatniej linijce:

java.io.IOException: Write error: I/O error during system call, Broken pipe
W/System.err( 2164):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativewrite(Native Method)
W/System.err( 2164):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.access$600(OpenSSLSocketImpl.java:55)
W/System.err( 2164):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:583)
W/System.err( 2164):  at java.io.OutputStream.write(OutputStream.java:82)
W/System.err( 2164):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.sendRequest(HttpURLConnectionImpl.java:1332)
W/System.err( 2164):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequestInternal(HttpURLConnectionImpl.java:1656)
W/System.err( 2164):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.doRequest(HttpURLConnectionImpl.java:1649)
W/System.err( 2164):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1153)
W/System.err( 2164):  at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:253)
Czy ktoś ma pojęcie, co tu jest nie tak?. Dzięki!
Author: Yasir Khan, 2010-07-28

6 answers

Pula połączeń używana przez HttpURLConnection podczas utrzymywania połączeń przy życiu jest zepsuta tak, że próbuje użyć połączeń, które zostały zamknięte przez serwer. Domyślnie Android ustawia KeepAlive na wszystkich połączeniach.

System.setProperty("http.keepAlive", "false"); jest obejściem, które wyłącza KeepAlive dla wszystkich połączeń, aby uniknąć błędu w puli połączeń.

conn.setRequestProperty("Connection","Keep-Alive"); włącza KeepAlive dla tego konkretnego połączenia, zasadniczo odwracając to, co robi System.setProperty("http.keepAlive", "false");.

Również zawsze jawnie wołam connect() ponieważ wyjaśnia, gdzie kończysz konfigurację połączenia. Nie jestem pewien czy wywołanie tej metody jest opcjonalne czy nie.

System.setProperty("http.keepAlive", "false");
HttpURLConnection conn = (HttpURLConnection) mURL.openConnection();
conn.setUseCaches(false); 
conn.setRequestProperty("User-Agent", useragent);
conn.setConnectTimeout(30000);
conn.setDoOutput(true); 
conn.setDoInput(true); 
consumer.sign(conn);

conn.connect();

InputSource is = new InputSource(conn.getInputStream());
 28
Author: barrycburton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-13 20:19:14

You dont need the System.setProperty("http.keepAlive", "false");

All you need is conn.setRequestProperty("connection", "close");

To rozwiązuje problem, ale skutecznie zabija utrzymanie Alive i dlatego potencjalnie powoduje spowolnienie wielu połączeń (co jest wstydem). Przeglądałem Harmony bug tracker, ale nie mogłem nic znaleźć.

@ fonetik, Czy wiesz, czy to jest już podniesione z harmonii? Nie chodzi mi o to, że to bardzo pomaga, ponieważ kolejna wada luni związana z http jest nadal nieprzypisana po ponad miesiącu.

 24
Author: RaB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-31 19:15:56

Rozwiązałem problem. Tutaj zostawiam ci kod, na wypadek, gdyby komuś się przydał. Zasadniczo widzę trend w Google za używanie HttpClient / HttpGet zamiast HttpUrlConnection. Więc próbowałem z tymi zajęciami i wszystko działało:

final HttpClient client = new DefaultHttpClient();
final HttpGet conn = new HttpGet(mURL.toString());

OAuthConsumer consumer = mOAuthManager.getPostConsumer();
consumer.sign(conn);
HttpResponse response = client.execute(conn);
InputSource is = new InputSource(response.getEntity().getContent());
 3
Author: ggomeze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-21 08:49:39

Ten błąd został naprawiony w wersji Android2. 3, Jak wiemy System.setProperty("http.keepAlive", "false"); nie jest zbyt dobrym rozwiązaniem, ponieważ na urządzeniu mobilnym tworzenie każdego połączenia jest za każdym razem kosztowne.

 1
Author: allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-31 19:14:42

Wierzę, że twój problem leży w kolejności Twojego kodu. Sprawdź te metody w URLConnection JavaDocs-setRequestProperty nie powinny być wywoływane po nawiązaniu połączenia na mUrl.openConnection (). Może to działać za pierwszym razem, ponieważ połączenie zostało nawiązane, a następnie zmieniasz ustawienia, które nie mają wpływu na nic, aż do następnej próby nawiązania połączenia. Spróbuj użyć konstruktora HttpURLConnection, aby wywołać connect() po ustawieniu właściwości.

 0
Author: ZachM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-29 05:40:34

Kiedy próbuję otworzyć połączenie https, działa dobrze, ale drugi raz się nie powiedzie, ponieważ ustawiłem wartość właściwości systemowej zamiast połączenia HttpsURLConnection. Mam problem java.io.IOException: Write error: I/O podczas otwierania połączenia https po raz drugi. Użyłem poniższego kodu w moim applicaiton.

System.setProperty("http.proxyHost", proxy);
System.setProperty("http.proxyPort", port);

Ale kiedy zmieniłem to samo na poniżej działa dobrze.

javax.net.ssl.HttpsURLConnection ucon = (javax.net.ssl.HttpsURLConnection) urlWPF.openConnection(proxyserver);

ucon.setRequestProperty("http.proxyHost", proxy);
ucon.setRequestProperty("http.proxyPort", port);

Jeśli ustawisz właściwość system, będzie ona stosowana dla całej aplikacji. Jeśli chcesz zresetować tak samo, możesz iść na dwa sposoby. Po pierwsze, musisz odświeżyć serwer, a po drugie, musisz zmienić HttpsURLConnection.setRequestProperty, o którym mowa powyżej, jeśli jest to wymagane.

 0
Author: user3411924,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 12:47:55