SSL で暗号化された文字列データを C++ サーバー (現在はローカル ネットワーク上) から読み取り、情報をそのまま返すアプリケーションを開発しています。
バウンシーキャッスル プロバイダー、カスタム ソケット ファクトリ、http クライアントに関する多くのチュートリアルと多くの例に従いました。エミュレータから C++ サーバーに情報を送信できるようになりましたが、エミュレータはソケット。代わりに私は得る:
java.net.SocketTimeoutException: 読み取りタイムアウト
サーバーはハンドシェイクと接続を認識し、エミュレーターが書き込む着信ステートメントを読み取ります。
リクエストは AsyncTask スレッド内で呼び出されています
private class getXmlTask extends AsyncTask<String, String, String> {
protected void onPreExecute() {
pd = ProgressDialog.show(NewJobsView.this,"Retrieving Data","Please Wait",true,false);
pd.setCancelable(true);
}
protected void onPostExecute(String XML) {
Log.i("XML:", XML);
parseXml();
pd.dismiss();
}
@Override
protected String doInBackground(String... params) {
return getXml();
}
}
これは私が使用しているリクエスト クラスです (少し面倒な場合はご容赦ください)。
public class HttpRequest{
MyHttpClient httpClient;
HttpContext localContext;
private String ret;
HttpResponse response = null;
HttpPost httpPost = null;
HttpGet httpGet = null;
Context context = null;
int retry = 0;
public HttpRequest(Context c){
HttpParams params = new BasicHttpParams();
context = c;
HttpConnectionParams.setConnectionTimeout(params, 60000);
HttpConnectionParams.setSoTimeout(params, 60000);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
httpClient = new MyHttpClient(context);
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
httpClient.setParams(params);
localContext = new BasicHttpContext();
}
public void abort() {
try {
if (httpClient != null) {
System.out.println("Abort.");
httpPost.abort();
}
} catch (Exception e) {
System.out.println("MyApp" + e);
}
}
public String sendPost(String url, String data) {
return sendPost(url, data, null);
}
public String sendPost(String url, String data, String contentType) {
ret = null;
httpPost = new HttpPost(url);
httpPost.addHeader("User-Agent", data);
response = null;
StringEntity ent = null;
try {
ent = new StringEntity(data,"UTF-8");
} catch (UnsupportedEncodingException e) {
Log.e("MyApp", "HttpUtils : UnsupportedEncodingException : "+e);
}
httpPost.setEntity(ent);
try {
response = httpClient.execute(httpPost);
if (response != null) {
ret = EntityUtils.toString(response.getEntity());
Log.e("MyApp", "HttpUtils: " + ret);
}
else{
abort();
}
} catch (Exception e) {
Log.e("MyApp", "HttpUtils: " + e);
}
Log.d("MyApp", "Returning value:" + ret);
if(retry < 3){
sendPost(url, data);
retry = retry +1;
}
else{
return ret;
}
return ret;
}
}
その他の注意事項:
私は持っている
uses-permission android:name="android.permission.INTERNET"
私のマニフェストファイルで。
また、他のクライアント (C++ ではありますが) が接続を維持し、ソケットから読み取ることができるため、SSL サーバーが機能することも確認しました。
MyHttpClient オブジェクトは のほぼレプリカです
クライアント証明書チェーンを含む BKS (BouncyCastle) 形式の Java キーストアを作成する方法
私は長い間車輪を回してきましたが、どんな答えでも大歓迎です。
ありがとうございました!