2012-04-19 3 views
0

Установили приложение подключения 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. Заранее спасибо.

+0

Вы используете задачу Asynch? Если нет, то стоит попробовать. – kosa

+0

@thinksteep: ни то, что мне помогло :(вот [файл журнала] (http://dl.dropbox.com/u/60536209/logcat.txt), который я получил при запуске приложения на Android 2.3, и приложение разработано для android 2.2, я надеюсь, что это не имеет значения. :( –

+0

'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' Эта штука появляется после создания сокета. Не почему, но его приход. –

ответ

0

Поскольку ssl-серверный сокет используется, и у меня есть собственный хост java, необходимо инициировать протокол установления связи вручную. Это сработало для меня!

Смежные вопросы