我讓我的應用程序和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;
}
編輯: 下面的代碼是用於上傳文件,如果我嘗試上傳小文件,代碼工作,但如果文件越來越大,我收到破裂的管道錯誤。使用更快的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;
}
請參閱http://stackoverflow.com/questions/2899079/custom-ssl-handling-stopped-working-on-android-2-2-froyo/2906293#comment7925084_2906293 – tonys
thx,但已經嘗試,同樣的錯誤。我使用代理的請求,但在我的WM應用程序它運行沒有錯誤,必須依賴於Android系統 – 2red13