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 소켓이 생성"후 중단됩니다. 미리 감사드립니다.
비동기 작업을 사용하고 있습니까? 그렇지 않은 경우 시도해 볼 가치가 있습니다. – kosa
@thinksteep : 둘 다 나를 도왔 :(여기는 [로그 파일] (http://dl.dropbox.com/u/60536209/logcat.txt) 내가 안드로이드 2.3에서 응용 프로그램을 실행하고있어 애플 리케이션이 개발되면 안드로이드 2.2, 나는 그것이 중요하지 않길 바란다 :( –
'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에서 이 것은 소켓이 생성 된 후에 나타납니다. 왜 그런가?하지만오고 있습니다 .. –