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();

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 にインテントによってアクティビティが記録されます。前もって感謝します。

4

1 に答える 1

0

SSL サーバー ソケットが使用され、独自の Java ホストがあるため、ハンドシェイク プロトコルを手動で開始する必要があります。これは私のために働いた!

于 2012-04-21T15:02:04.540 に答える