Установили приложение подключения 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();
rfbProtocol:
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;
}
Применение просто зависает после "РФБ Оправа создал", а затем активность вошедшего намеренно в LogCat. Заранее спасибо.
Вы используете задачу Asynch? Если нет, то стоит попробовать. – kosa
@thinksteep: ни то, что мне помогло :(вот [файл журнала] (http://dl.dropbox.com/u/60536209/logcat.txt), который я получил при запуске приложения на Android 2.3, и приложение разработано для android 2.2, я надеюсь, что это не имеет значения. :( –
'I/ActivityManager (159): Начало: Intent {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10100000 cmp = com.rfb.client/.RFB_ClientActivity bnds = [182,205] [238,271]} from pid 159' Эта штука появляется после создания сокета. Не почему, но его приход. –