android - read - httpurlconnection response null
HttpUrlConnection.openConnection falla la segunda vez (6)
Creo que su problema radica en el orden de su código. Compruebe esos métodos en el URLConnection JavaDocs - setRequestProperty no se debe llamar después de que la conexión se realiza en mUrl.openConnection (). Puede estar funcionando la primera vez porque se establece la conexión, y luego está cambiando la configuración que no está afectando nada hasta la próxima vez que intente establecer una conexión. Intente utilizar el constructor HttpURLConnection en su lugar para que pueda llamar a connect () después de haber establecido las propiedades.
Sé que este problema debería solucionarse con System.setProperty ("http.keepAlive", "false"); antes de openConnection, pero eso no funcionó para mí. Primero pruebe que este código funciona, el segundo falla. Incluso si intento esta solicitud después de menos de 5 segundos, también funciona. Si espero más que eso, falla de nuevo
Este es mi código:
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());
Recibo la excepción en la última línea:
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)
¿Alguien tiene una idea sobre lo que está mal aquí? ¡Gracias!
Cuando trato de abrir la conexión https, funciona bien, pero la segunda falla porque establecí el valor de la propiedad del sistema en lugar de la conexión HttpsURLConnection
. Tengo la java.io.IOException
: Error de escritura: problema de E / S al abrir la conexión https por segunda vez. He usado el siguiente código en mi solicitud.
System.setProperty("http.proxyHost", proxy);
System.setProperty("http.proxyPort", port);
Pero cuando cambié el mismo a continuación, funciona bien.
javax.net.ssl.HttpsURLConnection ucon = (javax.net.ssl.HttpsURLConnection) urlWPF.openConnection(proxyserver);
ucon.setRequestProperty("http.proxyHost", proxy);
ucon.setRequestProperty("http.proxyPort", port);
Si configura la propiedad del sistema, será aplicable para toda la aplicación. Si desea restablecer lo mismo, puede seguir dos caminos. Una es que debe realizar la actualización del servidor y la segunda es cambiar la HttpsURLConnection.setRequestProperty
que se menciona arriba cuando sea necesario.
El grupo de conexiones utilizado por HttpURLConnection
cuando mantiene las conexiones HttpURLConnection
se rompe de forma que intenta utilizar las conexiones que el servidor ha cerrado. De forma predeterminada, Android establece KeepAlive en todas las conexiones.
System.setProperty("http.keepAlive", "false");
es una solución que desactiva KeepAlive para todas las conexiones, por lo que evita el error en el grupo de conexiones.
conn.setRequestProperty("Connection","Keep-Alive");
activa KeepAlive para esta conexión en particular, revirtiendo esencialmente lo que System.setProperty("http.keepAlive", "false");
hace.
También siempre llamo explícitamente a connect()
ya que deja en claro dónde finaliza la configuración de la conexión. No estoy seguro si llamar a este método es opcional o no.
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());
No necesita System.setProperty("http.keepAlive", "false");
Todo lo que necesita es conn.setRequestProperty("connection", "close");
esto soluciona el problema, pero efectivamente mata a los que se mantienen activos y, por lo tanto, hace que las conexiones múltiples sean más lentas (lo cual es una pena). Estaba buscando a través del rastreador de errores de armonía, pero no pude encontrar nada.
@fonetik, ¿sabes si esto ya está planteado con armonía? Quiero decir que no es que sirva de mucho ya que otro defecto de luni relacionado con http sigue sin asignarse después de más de un mes.
Resolví el problema. Aquí te dejo el código, en caso de que pueda ser útil para alguien. Básicamente veo una tendencia en Google para usar HttpClient / HttpGet en lugar de HttpUrlConnection. Así que probé con esas clases, y todo funcionó:
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());
este error fue corregido en la versión Android2.3, ya que conocemos System.setProperty("http.keepAlive", "false");
No es una solución muy buena, porque en dispositivos móviles, crear cada conexión es siempre un costo elevado.