我正在尝试使用NamePairValues将图像字符串从android发送到服务器。它在http上工作正常,但在Https上不能。 使用Https,我的代码在移动应用程序上显示错误响应:
javax.net.ssl.SSLException: Write error: ssl=0x12ad700: I/O error during system call, Connection reset by peer
请帮助我如何解决这个问题。我使用了与SSL层完全相同的代码。我使用了SSL套接字工厂通用类。这是代码片段。
这是来自应用程序的呼叫线路。
nameValuePairs.add(new BasicNameValuePair("image", sendImages));
// nameValuePairs.add(new BasicNameValuePair("type", "L0"));
pBar = new ProgressDialog(this);
pBar.setCanceledOnTouchOutside(false);
pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pBar.setMessage("Communication With Server, Authenticating...");
pBar.show();
MyAsyncTask1 mTask = new MyAsyncTask1();
mTask.setOnResultsListener(this);
mTask.execute(myURL
, nameValuePairs);
这是一个执行任务的类
public class MyAsyncTask1 extends AsyncTask<Object, Integer, String> {
ResultsListener listener;
public void setOnResultsListener(ResultsListener listener) {
this.listener = listener;
}
@Override
protected String doInBackground(Object... params) {
// TODO Auto-generated method stub
String res = null;
DefaultHttpClient responseBody = null;
if (params.length > 0) {
String mUrl = params[0].toString();
List<NameValuePair> mParams = (List<NameValuePair>) params[1];
//String pam = "param1="+"dsd"+"¶m2="+mobile+"¶m3=" + "sds"+"¶m4="+"sdsds"+"¶m5="+"dsds"+"¶m6="+Images;
//String regx = "[] ";
//char[] ca = regx.toCharArray();
//for (char c : ca) {
// pam = pam.replace(""+c, "");
// pam = pam.replace(",", "&");
// }
try{
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
MySSLSocketFactory socketFactory = new MySSLSocketFactory(trustStore);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", socketFactory, 443));
socketFactory.setHostnameVerifier(socketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
DefaultHttpClient httpclient= new DefaultHttpClient();
httpclient.getConnectionManager().getSchemeRegistry().register(registry);
HttpPost httpget = new HttpPost(mUrl);
httpget.setEntity(new UrlEncodedFormEntity(mParams));
// System.out.println("executing request " + httpget.getRequestLine());
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
//System.out.println("----------------------------------------");
//System.out.println(response.getStatusLine());
//if (entity != null) {
// System.out.println("Response content length: " + entity.getContentLength());
//}
// Print html.
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
while ((line = in.readLine()) != null) {
res=line;
System.out.println(line);
}
in.close();
}catch(Exception e){
return res=e.toString();
}
}
return res;
}
@Override
protected void onPostExecute(String result) {
//Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
if (!listener.equals(null)) {
listener.onResultsSucceeded(result);
}
}
public HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null, null);
MySSLSocketFactory sf = new MySSLSocketFactory(trustStore);
sf.setHostnameVerifier(MySSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));
ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}
}
你为你的httpclient做了一个getNewHttpClient()方法,但没有使用?
DefaultHttpClient httpclient= new DefaultHttpClient();
...
尝试这样的事情:
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
httpClient = (DefaultHttpClient) getNewHttpClient();
HttpPost httpget = new HttpPost(mUrl);
httpget.setEntity(new UrlEncodedFormEntity(mParams));
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
BufferedReader in = new BufferedReader(new InputStreamReader(
response.getEntity().getContent()));
String line = "";
while ((line = in.readLine()) != null) {
res = line;
System.out.println(line);
}
in.close();
} catch (Exception e) {
return res = e.toString();
}