2011-11-08 15 views
9

(私はポストデータの膨大な量を持っている場合)、私はsomtimes自分のアプリケーションでPOST要求を行うと、次のエラーが発生しました:SSL壊れたパイプ

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

http.executeを実行しながら(httpost)コードに以下。 誰もこれを避ける方法を知っていますか?

AndroidHttpClientを使用しようとしましたが、基本認証に有効な方法が見つかりません そして、私はHttpsUrlConnectionを試しましたが、同じエラーが発生します。

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

編集: 次のコードは、私は小さなファイルをアップロードしようとした場合、ファイルをアップロードするために使用され、コードは動作しますが、ファイルが大きく得れば、私は壊れたパイプのエラーが表示されます。より高速なインターネット接続を使用すると、ファイルサイズが増加します。サーバーが接続をリセットするまでは、問題が発生しているようです。

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

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

+0

thxを参照してください。ただし、既に同じエラーが発生しています。私はリクエストにプロキシを使用しますが、私のWMアプリケーションではエラーなしで実行していますが、アンドロイドシステムに依存している必要があります – 2red13

答えて

1

私はDefaultHttpClient、AndroidHttpClientまたは抽象の問題を解決することができませんでしたが、最終的には代わりにCredentielsServiceのヘッダを経由してHttpsUrlRequestアリ認証で解決策を見つけた:私は同じを持っていた

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

エラー。問題はこれだったアンドロイドhttps://code.google.com/p/android/issues/detail?id=8625

私の問題のバグであるのAndroid APIレベル1以来の周りされているとAndroidHttpClientは、Android APIレベル8以降で利用可能ですDefaultHttpClientを使用しているAndroidのライブラリである: デフォルトタイムアウト 60秒です。 Wiresharkで接続したとき。それは、ハンドシェークを作成し、彼はApplicationDataを待っていたが、タイムアウトがFINを送信した後、それを取得しなかったので、私は持っている:javax.net.ssl.SSLException:書き込みエラー:ssl = 0x2f0610:I/Oエラーシステムコール、壊れたパイプ。

タイムアウトの設定で問題が解決しました.HTの接続が5分か何か値が60秒を超えています。問題をサーバWiresharkで実行し、モバイルデバイスで通信をリスニングする方法をお勧めします。

4

DefaultHttpClientを使用して同じ問題が発生しました。これは、HTTPClientの独自の実装を使用してhttpsをサポートしています。小さなファイルは正常に動作し、大きなファイルは時間の経過とともに失敗していました。

この回答を読んだ後、私は受け入れられた回答提案のようにHttpsURLConnectionに変更しました。また、アンドロイド(http://android-developers.blogspot.pt/2011/09/androids-http-clients.html)によって推奨されているためです。

問題が起きました。サーバー上で問題が発生していたことが判明しました。サイズを大きくする前にPHPサーバーからconfigsを変更しましたが、nginxの 'client_max_body_size'を変更するのを忘れてしまいました。その小さな変更を行った後、大きなファイルを送信していた。 HttpsUrlConnectionsとDefaultHttpClientの両方を使用します。

関連する問題