SSL断开的pipe道

我在我的应用程序和somtimes(如果我有大量的Post数据)POST请求,发生以下错误:

avax.net.ssl.SSLException:写入错误:ssl = 0x2f0610:系统调用期间发生I / O错误,Broken pipe

同时在下面的代码中执行http.execute(httpost)。 有人知道如何避免这种情况吗?

我尝试使用AndroidHttpClient,但无法find一个有效的基本身份validation方式而我尝试了一个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; } 

编辑:下面的代码用于上传文件,如果我尝试上传小文件,代码工作,但如果文件变大,我收到损坏的pipe道错误。 使用更快的Internet连接将增加文件大小,这似乎是一个问题,直到服务器重置连接的时间。

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

Solutions Collecting From Web of "SSL断开的pipe道"

我有使用DefaultHttpClient相同的问题,以及使用我自己的httpclient实现来支持https。 小文件工作正常,大文件一次又一次地失败。

阅读这个回应后,我已经改变到HttpsURLConnection像接受的答案build议,也因为它是由Android推荐( http://android-developers.blogspot.pt/2011/09/androids-http-clients.html )。

问题站起来了。 原来问题是在服务器上,我已经改变了从PHP服务器的configuration,以接受更大的尺寸,但我完全忘了改变nginx的'client_max_body_size'。 做了这个小改变发送大文件工作。 通过HttpsUrlConnections和DefaultHttpClient。

我无法解决与DefaultHttpClient,AndroidHttpClient或抽象的问题,但终于find了一个解决scheme与HttpsUrlRequestantvalidation通过头而不是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; } 

我得到了同样的错误。 问题是在Android库中使用DefaultHttpClient已经存在,因为Android API级别1和AndroidHttpClient已经可用,因为Android API级别8.这是Android中的错误https://code.google.com/p/android/issues /细节?ID = 8625

我的问题是:默认的超时时间是60秒。 当我在Wireshark中运行连接时。 这是创build握手,他一直在等待的ApplicationData,但他没有得到这样超时后发送FIN和我得到:javax.net.ssl.SSLException:写错误:ssl = 0x2f0610:I / O错误期间系统调用,pipe道损坏。

我解决了我的问题设置超时5分钟的http连接或东西值超过60秒。 如果我能build议如何解决你的问题在服务器Wireshark上运行,并与移动设备聆听通信。