Android HttpURLConnection lanzando EOFException

Aquí está la pregunta de la manera más simple.

Creo una conexión HTTPS a mi servidor a través de proxy utilizando HttpUrlConnection objeto.

Mi proxy cierra la conexión pero mi código todavía intenta reutilizar la misma conexión. Y así obtienes EOFException.

¿Cómo manejo estos casos?

12 Solutions collect form web for “Android HttpURLConnection lanzando EOFException”

Recomendaría inhabilitar la propiedad del sistema http.keepalive. La sección de rendimiento de la documentación indica que las conexiones de socket se reutilizarán cuando sea posible. Parece que está intentando reutilizar la conexión, pero el proxy ya la ha cerrado. En este post , Darrell también indica que el cambio de la propiedad del sistema resolvió su problema.

System.setProperty("http.keepAlive", "false"); 

Resulta que han arreglado este problema en Android el 8 de enero [1]. La corrección marca básicamente la conexión antigua como reciclado y reintenta internamente la solicitud.

Para arreglar esto por ahora, sugeriría reintentar peticiones si se encuentra una EOFException con un límite de reintento para evitar stackoverlows.

  1. https://android.googlesource.com/platform/libcore/+/19aa40c81c48ff98ccc7272f2a3c41479b806376

También tuve este problema con conexiones HTTP normales. La primera solicitud fue OK, la segunda falló con una EOFException.

Eventuelly lo arreglé quitando …

 urlConnection.setChunkedStreamingMode(0); 

… desde el HttpUrlConnection.

Podría ser que el servidor web que estoy llamando no puede manejar los datos chuncked bien. No lo sé.

Si no desea reutilizar la conexión, suéltela.

 finally { urlConnection.disconnect(); } 

No debería intentar reutilizar la misma instancia de HttpURLConnection. Los documentos en la línea inferior de la "Visión general de la clase" dicen

Cada instancia de HttpURLConnection se puede utilizar para un par de solicitud / respuesta.

Las conexiones Keep-Alive funcionan a un nivel diferente, vea los documentos de desconexión: http://developer.android.com/reference/java/net/HttpURLConnection.html#disconnect ()

A diferencia de otras implementaciones de Java, esto no necesariamente cerrará las conexiones de socket que pueden ser reutilizadas. Puede desactivar toda la reutilización de conexión estableciendo la propiedad del sistema http.keepAlive en false antes de emitir cualquier solicitud HTTP.

Por lo tanto, siempre debe utilizar una nueva HttpURLConnection y dejar que la toma de la piscina de socket de reutilización.

Había aparentemente errores con conexiones keep-alive pre-Froyo (2.2) por lo que se recomienda desactivar keep-alive en los dispositivos antiguos.

En mi caso, el EOFException fue causado por mi servidor no enviar una respuesta completa, ver los detalles aquí: https://stackoverflow.com/a/27845172/2335025

Puede utilizar este método para recoger datos del servidor y luego convertir las entradas recortar en cadena y luego analizarlas para su posterior utilización. »

  public static InputStream getUrlData(final String url) throws URISyntaxException, ClientProtocolException, IOException { final DefaultHttpClient client = new DefaultHttpClient(); final HttpGet method = new HttpGet(new URI(url)); final HttpResponse res = client.execute(method); return res.getEntity().getContent(); } 

Tal vez httpClient "tiene más errores" y está obsoleto, pero este problema con JellyBean es un espectáculo. Estoy usando Ksoap2 así que intenté todas las respuestas sugeridas que pude.

  • System.setProperty("http.keepAlive", "false");
  • httpTransportSE.getServiceConnection().setRequestProperty("Connection", "close");
  • httpTransportSE.getServiceConnection().disconnect();

Nada funcionó – mi solución era revertir la versión de Ksoap2 que estoy usando de 3.1.1 a 2.6.5. Usando 2.6.5 el problema se reduce sustancialmente. Todavía probando pero quizás incluso resuelto.

Encontré que reintentar la conexión corrige el problema como se ve aquí: https://stackoverflow.com/a/20302767/2520390

Asegúrese de cerrar la conexión antes de la llamada recursiva.

Además, he añadido lo siguiente a la conexión para cerrar la conexión, aunque no estoy seguro de si ayuda:

 if (retries > 0) { connection.setRequestProperty("Connection", "close"); } 

No debería intentar reutilizar la misma instancia de HttpURLConnection. Los documentos en la línea inferior de la "Visión general de la clase" dicen

Cada instancia de HttpURLConnection se puede utilizar para un par de solicitud / respuesta.

Las conexiones Keep-Alive funcionan a un nivel diferente, vea los documentos de desconexión: http://developer.android.com/reference/java/net/HttpURLConnection.html#disconnect ()

A diferencia de otras implementaciones de Java, esto no necesariamente cerrará las conexiones de socket que pueden ser reutilizadas. Puede desactivar toda la reutilización de conexión estableciendo la propiedad del sistema http.keepAlive en false antes de emitir cualquier solicitud HTTP.

Por lo tanto, siempre debe utilizar una nueva HttpURLConnection y dejar que la toma de la piscina de socket de reutilización. Hay quizás problemas si intenta reutilizar un zócalo que ha sido cerrado por el servidor, que las respuestas a esta pregunta se refieren a: Android HttpUrlConnection EOFException

Había aparentemente errores con conexiones keep-alive pre-Froyo (2.2) por lo que se recomienda desactivar keep-alive en los dispositivos antiguos.

En mi caso, el EOFException fue causado por mi servidor no enviar una respuesta completa, ver los detalles aquí: https://stackoverflow.com/a/27845939/2335025

  if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) { con.setRequestProperty("Connection", "close"); } 

Pruebe este código: `

Método de Httppost:

  HttpParams httpParams = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC); HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC); HttpClient client = new DefaultHttpClient(httpParams); HttpPost request = new HttpPost("put_url"); request.setHeader("Content-Type", "application/xml"); String file = resourceXml(); StringEntity se = null; try { se = new StringEntity(file); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } se.setContentEncoding("UTF-8"); se.setContentType("application/xml"); request.setEntity(se); HttpResponse response = null; try { response = client.execute(request); } catch (ClientProtocolException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } HttpEntity entity = response.getEntity(); InputStream is = null; try { is = entity.getContent(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } String _response = convertStreamToString(is); Log.i(TAG, "Response:" + _response); // Check if server response is valid code int res_code = response.getStatusLine().getStatusCode(); Log.i(TAG, "status_code" + res_code); try { is.close(); } catch (IOException e) { e.printStackTrace(); } 

para convertir la secuencia en cadena: `

 private static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is), 8192); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append((line + "\n")); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); }` 
  • Android: cita única escapada misteriosa en nombre de lugar codificado Uri
  • HttpURLConnection getResponseCode () deos no devuelve si no hay conexión a Internet
  • La sincronización bidireccional para las cookies entre HttpURLConnection (java.net.CookieManager) y WebView (android.webkit.CookieManager)
  • Cómo agregar parámetros a HttpURLConnection mediante POST
  • Pase las cookies de HttpURLConnection (java.net.CookieManager) a WebView (android.webkit.CookieManager)
  • Java HttpURLConnection VS Android HttpURLConnection
  • Android: intentando obtener datos de youtube api
  • Cómo detener HttpURLConnection.getInputStream ()?
  • HTTP Basic problema de autenticación en Android Jelly Bean 4.1 con HttpURLConnection
  • ¿Cómo puedo dividir la lógica de HttpUrlConnection en varios métodos?
  • Android: java.net.protocolException no admite salida
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.