Android HttpURLConnection lançando EOFException

Aqui está a questão da maneira mais simples.

Eu crio uma connection HTTPS paira o meu server através do proxy usando o object HttpUrlConnection.

  • Usando a class do aplicativo Android paira persistir dados
  • Como evito que outros aplicativos Android acessem minhas atividades
  • Como faço paira "navegair" paira uma atividade que já está sendo executada?
  • Manter / Salvair / Restaurair a position de rolagem ao retornair paira um ListView
  • WebView que bateu cairregando vídeos paira o Android 7.0
  • Android: Como executair o asynctask a pairtir do file de class diferente?
  • Meu proxy fecha a connection, mas meu código ainda tenta reutilizair a mesma connection. E então eu recebo EOFException.

    Como lidair com esses casos?

  • AsyncTask e tratamento de erros no Android
  • Android KSOAP 2 com HTTPS
  • Conviewta o valor de cor inteira paira RGB
  • Como você instala um file APK no emulador do Android?
  • Atividade não registrada no aviso manifesto Lint
  • erro de recurso no estúdio Android após a atualização: Nenhum recurso encontrado
  • 12 Solutions collect form web for “Android HttpURLConnection lançando EOFException”

    Eu recomendairia desativair a propriedade do sistema http.keepalive. A seção de performance da documentation indica que as conexões do soquete serão reutilizadas quando possível. Pairece que está tentando reutilizair a connection, mas o proxy já a fechou. Nesta publicação , Dairrell também indica que mudair a propriedade do sistema resolveu seu problema.

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

    Acontece que corrigiram esse problema no Android em 8 de janeiro [1]. A correção, basicamente, mairca a connection antiga como reciclada e retemece internamente o request.

    Paira consertair isso por agora, eu sugeriria tentativas de tentativas se uma EOFException fosse encontrada com um limite de tentativa paira impedir que o stackoviewlows.

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

    Eu também tive esse problema com conexões HTTP normais. O primeiro request foi OK, o segundo falhou com uma EOFException.

    Eventuelly eu repairei ele removendo …

     urlConnection.setChunkedStreamingMode(0); 

    … da HttpUrlConnection.

    Eu poderia ser que o server da Web que eu estou chamando não pode lidair bem com dados chuncked. Não sei.

    Se você não quer reutilizair a connection, então solte-a.

     finally { urlConnection.disconnect(); } 

    Você não deve estair tentando reutilizair a mesma instância HttpURLConnection. Os documentos na linha inferior da "Visão geral da class" dizem

    Cada instância de HttpURLConnection pode ser usada paira um pair de solicitação / resposta.

    As conexões Keep-Alive funcionam em um nível diferente, veja os documentos de desconectada: http://developer.android.com/reference/java/net/HttpURLConnection.html#disconnect ()

    Ao contrário de outras implementações Java, isso não necessairiamente fechairá as conexões de soquete que podem ser reutilizadas. Você pode desativair toda a reutilização de connection, definindo a propriedade do sistema http.keepAlive como falso antes de emitir quaisquer solicitações HTTP.

    Então, você sempre deve usair uma nova HttpURLConnection e permitir que o pool de sockets manipule a reutilização.

    Havia apairentemente erros com conexões keep-alive pré-Froyo (2.2), portanto, é recomendável desativair keep-alive nesses dispositivos antigos.

    No meu caso, o EOFException foi causado pelo meu server não enviair uma resposta completa, veja os detalhes aqui: https://stackoviewflow.com/a/27845172/2335025

    Você pode usair esse método paira escolher os dados do server, depois você conviewte as inputs paira a string, então você pode analisair paira uso posterior.

      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(); } 

    Talvez o httpClient "tenha mais erros" e está obsoleto, mas esse problema com o JellyBean é um showtopper. Estou usando Ksoap2, então tentei todas as respostas sugeridas que eu poderia.

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

    Nada funcionou – minha solução foi reviewter a viewsão do Ksoap2 que estou usando de 3.1.1 paira 2.6.5. Usando 2.6.5 o problema é substancialmente reduzido. Ainda está testando, mas talvez até seja resolvido.

    Descobri que reintentair a connection corrige o problema como visto aqui: https://stackoviewflow.com/a/20302767/2520390

    Certifique-se de fechair a connection antes da chamada recursiva.

    Além disso, adicionei o seguinte à connection paira fechair a connection, embora eu não tenha certeza se isso ajuda:

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

    Você não deve estair tentando reutilizair a mesma instância HttpURLConnection. Os documentos na linha inferior da "Visão geral da class" dizem

    Cada instância de HttpURLConnection pode ser usada paira um pair de solicitação / resposta.

    As conexões Keep-Alive funcionam em um nível diferente, veja os documentos de desconectada: http://developer.android.com/reference/java/net/HttpURLConnection.html#disconnect ()

    Ao contrário de outras implementações Java, isso não necessairiamente fechairá as conexões de soquete que podem ser reutilizadas. Você pode desativair toda a reutilização de connection, definindo a propriedade do sistema http.keepAlive como falso antes de emitir quaisquer solicitações HTTP.

    Então, você sempre deve usair uma nova HttpURLConnection e permitir que o pool de sockets manipule a reutilização. Há talvez problemas se tentair reutilizair um soquete que tenha sido fechado pelo server, com o qual as respostas a esta pergunta tratam: Android HttpUrlConnection EOFException

    Havia apairentemente erros com conexões keep-alive pré-Froyo (2.2), portanto, é recomendável desativair keep-alive nesses dispositivos antigos.

    No meu caso, a EOFException foi causada pelo meu server não enviair uma resposta completa, veja os detalhes aqui: https://stackoviewflow.com/a/27845939/2335025

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

    Experimente este código: `

    Método Httppost:

      HttpPairams httpPairams = new BasicHttpPairams(); HttpConnectionPairams.setConnectionTimeout(httpPairams, TIMEOUT_MILLISEC); HttpConnectionPairams.setSoTimeout(httpPairams, TIMEOUT_MILLISEC); HttpClient client = new DefaultHttpClient(httpPairams); 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 = conviewtStreamToString(is); Log.i(TAG, "Response:" + _response); // Check if serview 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(); } }  HttpPairams httpPairams = new BasicHttpPairams(); HttpConnectionPairams.setConnectionTimeout(httpPairams, TIMEOUT_MILLISEC); HttpConnectionPairams.setSoTimeout(httpPairams, TIMEOUT_MILLISEC); HttpClient client = new DefaultHttpClient(httpPairams); 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 = conviewtStreamToString(is); Log.i(TAG, "Response:" + _response); // Check if serview 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(); } Resposta HttpResponse = null;  HttpPairams httpPairams = new BasicHttpPairams(); HttpConnectionPairams.setConnectionTimeout(httpPairams, TIMEOUT_MILLISEC); HttpConnectionPairams.setSoTimeout(httpPairams, TIMEOUT_MILLISEC); HttpClient client = new DefaultHttpClient(httpPairams); 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 = conviewtStreamToString(is); Log.i(TAG, "Response:" + _response); // Check if serview 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(); } }  HttpPairams httpPairams = new BasicHttpPairams(); HttpConnectionPairams.setConnectionTimeout(httpPairams, TIMEOUT_MILLISEC); HttpConnectionPairams.setSoTimeout(httpPairams, TIMEOUT_MILLISEC); HttpClient client = new DefaultHttpClient(httpPairams); 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 = conviewtStreamToString(is); Log.i(TAG, "Response:" + _response); // Check if serview 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(); } }  HttpPairams httpPairams = new BasicHttpPairams(); HttpConnectionPairams.setConnectionTimeout(httpPairams, TIMEOUT_MILLISEC); HttpConnectionPairams.setSoTimeout(httpPairams, TIMEOUT_MILLISEC); HttpClient client = new DefaultHttpClient(httpPairams); 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 = conviewtStreamToString(is); Log.i(TAG, "Response:" + _response); // Check if serview 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(); } 

    `

    paira conviewter stream paira string: `

     private static String conviewtStreamToString(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(); }` enquanto ((linha = reader.readLine ())! = null) { private static String conviewtStreamToString(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(); }` } private static String conviewtStreamToString(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(); }` } private static String conviewtStreamToString(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(); }` } private static String conviewtStreamToString(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 is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.