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

3 Solutions collect form web for “SSL Broken Pipe”

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.

  • Conexión de Https con conexión cerrada por peer en Android 6.0
  • Aplicación de Android Conexión al servidor Node.js mediante Socket.io
  • CertPathValidatorException: Ancla de confianza para ruta de certificación no encontrada
  • Android 2.3.4 problema de SSL
  • Solicitud HTTP de SSL de Android mediante cert auto-firmado y CA
  • Convertir archivo JKS a BKS o crear archivo BKS
  • Error de certificado no confiable y httpclient en android
  • Javax.net.ssl.SSLPeerUnverifiedException: Ningún certificado de compañero mientras estoy trabajando con google place api en android
  • Administrador SDK Host desconocido dl-ssl.google.com
  • Android - convertir la cadena de certificados pkcs12 al objeto de certificado x509 para bks keystore
  • SSLSocketFactory establecimiento de tiempo de espera y propiedades de socket
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.