SSL接続アプリをセットアップし、シングルスレッドを使用してクライアントとサーバー間の接続をすでにセットアップしています。私のアプリはリモート デスクトップ アクセスを扱うため、スレッド化を実装しようとしています。
ソケットの作成後にアプリケーションが停止する理由がわかりません。失敗したり、SSLhandshake を実行したりしません。シングルスレッドで実行すると同じコードがスムーズに動作しますが、マルチスレッドではそうではありません。logcat を試してみましたが、役に立ちませんでした。10 ~ 15 回の試行のうち、アプリケーションは 1 回は正常に動作しますが、非応答モードになります。
私が間違っているところに何か考えはありますか?コードは次のとおりです。どんな答えでも共有してください。
主な活動:
Thread t = new Thread() {
public void run() {
try{
Log.d(TAG, "Opening RFB socket");
rfb = new rfbProtocol(ip, port, RFB_ClientActivity.getContext());
txt_notify.append("Connection done");
Log.d(TAG, "RFB socket openned");
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
progress.setMessage("Connection established..\nPlease wait");
}
});
processProtocol(progress);
}catch(Exception e){
if(maintainConnection){
if(progress.isShowing())
progress.dismiss();
txt_notify.append( "Connection failure:\n" + e.getMessage() );
Log.d(TAG,"RFB socket failure");
e.printStackTrace();
}
}
}
};
t.start();
rfbプロトコル:
rfbProtocol(String h, int p, Context c) throws Exception {
// TODO Auto-generated constructor stub
host = h;
port = p;
cont = c;
try {
// Setup the SSL context to use the truststore and keystore
Log.d(TAG, "Initializing SSL connection");
SSLContext ssl_context = createSSLContext(cont);
SSLSocketFactory socketFactory = (SSLSocketFactory) ssl_context.getSocketFactory();
Log.d(TAG,"Creating RFB socket");
socket = (SSLSocket) socketFactory.createSocket(host, port);
Log.d(TAG,"RFB Socket created");
dataOut = socket.getOutputStream();
dataIn = new DataInputStream(new BufferedInputStream(socket.getInputStream(), 16384));
close = false;
Log.d(TAG,"SSL connection done");
} catch (Exception e) {
// TODO Auto-generated catch block
throw(e);
}
}
private SSLContext createSSLContext(final Context cont) throws Exception{
SSLContext ssl_cont = null;
try {
// Setup truststore
Log.d(TAG, "TrustStore - Initializing");
KeyStore trustStore = KeyStore.getInstance("BKS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
InputStream trustStoreStream = cont.getResources().openRawResource(R.raw.clienttruststore);
trustStore.load(trustStoreStream, "client".toCharArray());
trustManagerFactory.init(trustStore);
Log.d(TAG, "TrustStore - Initialized");
// Setup keystore
Log.d(TAG, "KeyStore - Initializing");
KeyStore keyStore = KeyStore.getInstance("BKS");
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
InputStream keyStoreStream = cont.getResources().openRawResource(R.raw.client);
keyStore.load(keyStoreStream, "client".toCharArray());
keyManagerFactory.init(keyStore, "client".toCharArray());
Log.d(TAG, "KeyStore - Initialized");
ssl_cont = SSLContext.getInstance("TLS");
ssl_cont.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
} catch (Exception e) {
// TODO Auto-generated catch block
throw(e);
}
return ssl_cont;
}
「RFB ソケットが作成されました」の後にアプリケーションがハングし、続いて logcat にインテントによってアクティビティが記録されます。前もって感謝します。