2012-04-19 4 views
0

ssl 연결 응용 프로그램을 설치 했으므로 이미 단일 스레드를 사용하여 클라이언트와 서버간에 연결을 설정하십시오. 내 애플 리케이션은 원격 데스크톱 액세스를 다루기 때문에, 나는 스레딩을 구현하려고합니다.스레드로 작업하는 동안 응용 프로그램이 멈 춥니 다.

소켓을 만든 후에 응용 프로그램이 멈추는 이유를 모르면 SSL 핸드 셰이크도 실패하지도 않습니다. 단일 스레드에서 실행될 때 동일한 코드가 원활하게 작동하지만 다중 스레드에서는 그렇지 않습니다. 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; 
} 

응용 프로그램은 단지 로그 캣의 의도에 의해 기록 된 활동에 의해 다음, "RFB 소켓이 생성"후 중단됩니다. 미리 감사드립니다.

+0

비동기 작업을 사용하고 있습니까? 그렇지 않은 경우 시도해 볼 가치가 있습니다. – kosa

+0

@thinksteep : 둘 다 나를 도왔 :(여기는 [로그 파일] (http://dl.dropbox.com/u/60536209/logcat.txt) 내가 안드로이드 2.3에서 응용 프로그램을 실행하고있어 애플 리케이션이 개발되면 안드로이드 2.2, 나는 그것이 중요하지 않길 바란다 :( –

+0

'I/ActivityManager (159) : Starting : Intent {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10100000 cmp = com.rfb.client/.RFB_ClientActivity bnds = [182205] [238,271]} pid 159에서 이 것은 소켓이 생성 된 후에 나타납니다. 왜 그런가?하지만오고 있습니다 .. –

답변

0

ssl 서버 소켓이 사용되며 자체 자바 호스트가 있으므로 수동으로 핸드 셰이크 프로토콜을 시작해야합니다. 이것은 나를 위해 일했습니다!

관련 문제