SSL Broken Pipe

Hago peticiones POST en mi aplicación y somtimes (si tengo una gran cantidad de datos Post), se produjo el siguiente error:

Avax.net.ssl.SSLException: Error de escritura: ssl = 0x2f0610: Error de E / S durante la llamada al sistema, Broken pipe

Mientras ejecuta http.execute (httpost) en el código de abajo. ¿Alguien sabe cómo evitar esto?

Intenté usar AndroidHttpClient, pero no puedo encontrar una manera válida para la autenticación básica y probé una HttpsUrlConnection, pero consigo el mismo error.

public static String makePOSTRequest(String s, List<NameValuePair> nvps, String encoding) { String ret = ""; UsernamePasswordCredentials c = new UsernamePasswordCredentials("XXX", "YYY"); BasicCredentialsProvider cP = new BasicCredentialsProvider(); cP.setCredentials(AuthScope.ANY, c); HttpParams httpParams = new BasicHttpParams(); int connection_Timeout = 5000; HttpConnectionParams.setConnectionTimeout(httpParams, connection_Timeout); HttpConnectionParams.setSoTimeout(httpParams, connection_Timeout); DefaultHttpClient http = new DefaultHttpClient(httpParams); http.setCredentialsProvider(cP); HttpResponse res; try { HttpPost httpost = new HttpPost(s); httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.DEFAULT_CONTENT_CHARSET)); res = http.execute(httpost); InputStream is = res.getEntity().getContent(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte) current); } res = null; httpost = null; ret = new String(baf.toByteArray(), encoding); break; } catch (ClientProtocolException e) { ret = e.getMessage(); } catch (IOException e) { ret = e.getMessage(); } return ret; } 

Editar: El siguiente código se utiliza para cargar archivos, si intento subir archivos pequeños, el código funciona, pero si los archivos se hacen más grandes, recibo el error de tubería rota. El uso de una conexión de Internet más rápida aumentará el tamaño de archivo, parece ser un problema con el tiempo hasta que el servidor está restableciendo la conexión.

 public static boolean upload_image2(String url, List<NameValuePair> nameValuePairs, File file, String encoding) { boolean erg = false; HttpParams httpParams = new BasicHttpParams(); int connection_Timeout = 120000; HttpConnectionParams.setConnectionTimeout(httpParams,connection_Timeout); HttpConnectionParams.setSoTimeout(httpParams, connection_Timeout); http = new DefaultHttpClient(httpParams); HttpResponse res; UsernamePasswordCredentials c = new UsernamePasswordCredentials(username, password); BasicCredentialsProvider cP = new BasicCredentialsProvider(); cP.setCredentials(AuthScope.ANY, c); try { HttpPost httpost = new HttpPost(url); MultipartEntity entity = new MultipartEntity( HttpMultipartMode.STRICT); FileBody isb = new FileBody(file, "application/*"); entity.addPart("File", isb); for (int index = 0; index < nameValuePairs.size(); index++) { ContentBody cb; // Normal string data cb = new StringBody(nameValuePairs.get(index).getValue(), "", null); entity.addPart(nameValuePairs.get(index).getName(), cb); } httpost.setEntity(entity); res = http.execute(httpost); InputStream is = res.getEntity().getContent(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte) current); } res = null; httpost = null; String ret = new String(baf.toByteArray(), encoding); LastError = ret; erg = true; } catch (ClientProtocolException e) { // TODO Auto-generated catch block LastError = e.getMessage(); erg = false; } catch (IOException e) { // TODO Auto-generated catch block LastError = e.getMessage(); erg = false; } return erg; } 

He tenido el mismo problema con el DefaultHttpClient, así, utilizando mi propia implementación del httpclient para apoyar https. Archivos pequeños que funcionaba bien y los archivos grandes estaban fallando una y otra vez.

Después de leer esta respuesta he cambiado a la HttpsURLConnection como la respuesta aceptada sugieren y también porque es recomendado por android ( http://android-developers.blogspot.pt/2011/09/androids-http-clients.html ).

El problema estaba parado. Resulta que el problema estaba en el servidor, he cambiado los configs del servidor PHP antes de aceptar tamaños más grandes, pero me olvidé completamente de cambiar el 'client_max_body_size' del nginx. Después de hacer ese pequeño cambio enviando archivos grandes estaba funcionando. A través de HttpsUrlConnections y DefaultHttpClient.

No pude solucionar el problema con DefaultHttpClient, AndroidHttpClient o Abstract, pero finalmente encontré una solución con HttpsUrlRequest ant Authentication vía header en vez de CredentielsService:

 public static boolean upload_image5(String urls,File file, String encoding){ HttpURLConnection connection = null; DataOutputStream outputStream = null; DataInputStream inputStream = null; String myfilename = file.getName(); String urlServer = urls; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; boolean erg = false; int bytesRead, bytesAvailable, bufferSize; byte[] buffer; int maxBufferSize = 1*1024*1024; try { FileInputStream fileInputStream = new FileInputStream(file); URL url = new URL(urlServer); connection = (HttpsURLConnection) url.openConnection(); // Allow Inputs & Outputs connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); // Enable POST method connection.setRequestMethod("POST"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); connection.addRequestProperty("Authorization","Basic [YOUR MD5 LOGIN VALUE]"); outputStream = new DataOutputStream( connection.getOutputStream() ); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream.writeBytes("Content-Disposition: form-data; name=\"DestFileName\""); outputStream.writeBytes(lineEnd); outputStream.writeBytes(lineEnd); outputStream.writeBytes(myfilename); outputStream.writeBytes(lineEnd); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream.writeBytes("Content-Disposition: form-data; name=\"Target\"" ); outputStream.writeBytes(lineEnd); outputStream.writeBytes(lineEnd); outputStream.writeBytes("DOC"); outputStream.writeBytes(lineEnd); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream.writeBytes("Content-Disposition: form-data; name=\"filename\""); outputStream.writeBytes(lineEnd); outputStream.writeBytes(lineEnd); outputStream.writeBytes(myfilename); outputStream.writeBytes(lineEnd); outputStream.writeBytes(twoHyphens + boundary + lineEnd); outputStream.writeBytes("Content-Disposition: form-data; name=\"File\"; filename=\"" + myfilename + "\""); outputStream.writeBytes(lineEnd); outputStream.writeBytes("Content-Type: application/*"); outputStream.writeBytes(lineEnd); outputStream.writeBytes(lineEnd); //hier File schreiben bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); buffer = new byte[bufferSize]; bytesRead = fileInputStream.read(buffer, 0, bufferSize); while (bytesRead > 0) { outputStream.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(); bufferSize = Math.min(bytesAvailable, maxBufferSize); bytesRead = fileInputStream.read(buffer, 0, bufferSize); } outputStream.writeBytes(lineEnd); outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); fileInputStream.close(); try { inputStream = new DataInputStream(connection.getInputStream()); StringBuilder response = new StringBuilder(); String line; while ((line = inputStream.readLine()) != null) { response.append(line).append('\n'); } LastError =response.toString(); erg = true; } catch (IOException e) { LastError = e.getMessage(); erg = false; } finally { if (inputStream != null){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } outputStream.flush(); outputStream.close(); } catch (Exception ex) { LastError = ex.getMessage(); erg = false; } return erg; } 

Yo tenía el mismo error. El problema está en la biblioteca de Android donde se utiliza DefaultHttpClient ha existido desde Android API nivel 1 y AndroidHttpClient ha estado disponible desde la API de Android nivel 8. Esto es un error en android https://code.google.com/p/android/issues / Detail? Id = 8625

Mi problema era: El tiempo de espera predeterminado es de 60 segundos. Cuando corrí la conexión en el Wireshark. Se creó el apretón de manos y él ha estado esperando en el ApplicationData, pero él no lo consiguió así que después de timeout envíe FIN y tengo: javax.net.ssl.SSLException: Error de la escritura: ssl = 0x2f0610: Error de E / S durante Llamada del sistema, tubo roto.

He resuelto mi problema de configuración de tiempo de espera la conexión http en los 5 minutos o algo de valor es más de 60 segundos. Si puedo recomendar como resolver su problema en el servidor Wireshark y escuchar la comunicación con el dispositivo móvil.

  • ¿Cómo anular la lista de cifrado enviada al servidor por Android cuando se utiliza HttpsURLConnection?
  • Cómo administrar la conexión ssl cuando el servicio de red cambia
  • DownloadManager: entiende la política de reintentos y los códigos de error
  • Android - ¿Cómo almacenar certificado en keystore mediante programación?
  • Administrador SDK Host desconocido dl-ssl.google.com
  • Cómo utilizar el SSL con multi entidad en android
  • HTTPS GET (SSL) con Android y certificado de servidor auto-firmado
  • Cliente SSL en Android
  • no se puede conectar al servidor utilizando BKS keystore
  • ¿Por qué vuelve Volley a SSLV3?
  • OkHttp certificado de confianza
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.