11
votes

Pipe cassée SSL

Je fais des demandes postales dans mon application et sur SOMTimes (si j'ai une énorme quantité de données post), l'erreur suivante s'est produite:

Avax.net.ssl.sSlexception: Erreur d'écriture: SSL = 0x2f0610: E / S Erreur lors de l'appel système, Tuyau cassé P> blockQuote>

en exécutant http.execute (httpost) dans le code ci-dessous. Est-ce que quelqu'un sait comment éviter cela? P>

J'ai essayé d'utiliser Androidhttpclient, mais je ne trouve pas de manière valide pour l'authentification de base Et j'ai essayé une httppsurlconnection, mais obtenez la même erreur. P>

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 commentaires

Voir Stackoverflow.com/Questions/2899079/...


thx, mais déjà essayé, même erreur. J'utilise un proxy pour la demande, mais dans mon application WM ne fonctionnant pas sans erreurs, vous devez dépendre du système Android.


Parfois, cela se produit en raison du problème de la connectivité Internet. Je suis aussi face à cela.


3 Réponses :


1
votes

Je n'ai pas pu résoudre le problème avec DefaulthttpClient, AndroidhttpClient ou Résumé, mais j'ai finalement trouvé une solution avec authentification HttpSurlrequest ANT via l'en-tête au lieu 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;
}


0 commentaires

3
votes

J'avais la même erreur. Le problème est dans la bibliothèque Android où l'utilisation de DefaulthttpClient existe depuis que Android API Niveau 1 et AndroidhttpClient est disponible depuis Android API Niveau 8. Ceci est un bogue dans Android https://code.google.com/p/android/issues/detail?id=8625

Mon problème était: Le délai d'attente est de 60 secondes. Quand j'ai dirigé la connexion dans le fil du fil. Il a été créé une poignée de main et il attend sur l'applicationData, mais il ne l'a pas obtenu, il n'y a pas été aussi après l'envoi du délai d'attente et j'ai: javax.net.ssl.slexception: Erreur d'écriture: SSL = 0x2F0610: Erreur d'E / S pendant Appel système, tuyau brisé.

J'ai résolu mon problème de problème de problème de problème de réglage de la connexion HTTP sur les 5 minutes ou une valeur de quelque chose dépasse 60 secondes. Si je peux recommander comment résoudre votre problème exécuté sur le serveur Wireshark et écoute la communication avec le périphérique mobile.


0 commentaires

5
votes

J'ai eu le même problème à l'aide de la défaulttpclient, eh bien, en utilisant ma propre implémentation du httpClient pour prendre en charge HTTPS. Les petits fichiers que cela fonctionnait bien et que de gros fichiers ont échoué le temps après la période.

Après avoir lu cette réponse, j'ai changé à l'adresse httppsurlconnection comme la réponse acceptée suggère et aussi parce qu'elle est recommandée par Android ( http://android-developers.blogspot.pt/2011/09/Androids-http-clients.html ).

Le problème se tenait. Il s'agit du problème sur le serveur, j'ai modifié les configurations du serveur PHP avant d'accepter de plus grandes tailles, mais j'ai totalement oublié de modifier le client_max_body_size du nginx. Après avoir fait que la petite modification, envoyer de gros fichiers fonctionnait. À la fois httppsurlconnections et défaulttpclient.


0 commentaires