2011-11-08 19 views
9

Puedo hacer solicitudes de POST en mi solicitud y somtimes (si tengo una enorme cantidad de datos de correos), se produjo el siguiente error:SSL Broken Pipe

avax.net.ssl.SSLException: Write error: ssl=0x2f0610: I/O error during system call, Broken pipe

durante la ejecución de http.execute (httpost) en el código abajo. ¿Alguien sabe cómo evitar esto?

Intenté usar AndroidHttpClient, pero no puedo encontrar una forma válida para la autenticación básica Y probé HttpsUrlConnection, pero obtengo 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; 
} 

edición: El siguiente código se utiliza para la carga de archivos, si trato de subir archivos pequeños, el código funciona, pero si los archivos se hacen más grandes, recibo el error tubería rota. El uso de una conexión a Internet más rápida aumentará el tamaño del archivo, parecía ser un problema con el tiempo hasta que el servidor restablezca 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; 
} 
+0

Consulte http://stackoverflow.com/questions/2899079/custom-ssl-handling-stopped-working-on-android-2-2-froyo/2906293#comment7925084_2906293 – tonys

+0

thx, pero ya lo intenté, mismo error. Utilizo un proxy para la solicitud, pero en mi aplicación WM no se ejecuta sin errores, debe depender del sistema android – 2red13

Respuesta

1

yo no era capaz de solucionar el problema con DefaultHttpClient, AndroidHttpClient o abstracta, pero finalmente encontró una solución con HttpsUrlRequest autenticación de hormigas a través de cabecera en lugar 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; 
} 
1

había conseguido el mismo error. El problema está en la biblioteca, donde Android es utilizar DefaultHttpClient ha existido desde Android API de nivel 1 y AndroidHttpClient ha estado disponible desde el nivel de la API de Android 8. Esto es error en Android https://code.google.com/p/android/issues/detail?id=8625

Mi problema era: El valor predeterminado de tiempo de espera es 60 segundos. Cuando ejecuté la conexión en Wireshark. Se creó un apretón de manos y él ha estado esperando en el ApplicationData, pero no lo obtuvo, así que después de un tiempo de espera, envíe FIN y tengo: javax.net.ssl.SSLException: Error de escritura: ssl = 0x2f0610: Error de E/S durante llamada al sistema, tubería rota.

Resolví mi problema de configuración de problemas de tiempo de espera la conexión http en los 5 minutos o algo valor es más largo que 60 segundos. Si puedo recomendar cómo resolver su problema ejecutado en el servidor Wireshark y escuchar la comunicación con el dispositivo móvil.

4

He tenido el mismo problema al utilizar DefaultHttpClient, bueno, usando mi propia implementación de httpclient para admitir https. Los archivos pequeños funcionaban bien y los archivos grandes fallaban una y otra vez.

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

El problema era el problema. Resulta que el problema estaba en el servidor, he cambiado las configuraciones del servidor PHP antes para aceptar tamaños más grandes, pero me olvidé por completo de cambiar el 'client_max_body_size' del nginx. Después de hacer ese pequeño cambio, el envío de archivos grandes estaba funcionando. A través de HttpsUrlConnections y DefaultHttpClient.

Cuestiones relacionadas