1

AndroidアプリをSSLを使用してAndroidアプリとWebサーバー間で情報を転送するように変換しようとすると、問題が発生します。(SocketTimeOutException)

認証局(CA)からPositive SSL証明書を購入し、それを正しく処理するようにサーバーを構成しました。私はそれを私のウェブブラウザでテストし、正しく動作しています。

現在、Androidアプリを変更してhttpではなくhttpsを使用しようとしていますが、自分でhttpsを使用するのはこれが初めてなので、Javaコードに実装する必要のある手順について少し混乱しています。

現在、正しいURLを使用するようにアプリを構成する設定ページで作業しています。たとえば、WebサイトのURL(http://www.mydomain.com)と、関連するページが保存されているアプリケーションフォルダー(myappfolder)を入力するアクティビティに2つのテキストフィールドがあります。

次に、次のコードを使用して接続し、接続変数が正しく構成されていることをテストします。ここで、validateurl.aspxは、ページが存在する場合にJSON文字列を返すWebページです。

protected boolean validateConnectionSettings() {        

    String result = "";
    boolean validated = false;
    try {
        StringBuilder urlBuilder = new StringBuilder();
        urlBuilder.append(tvWebsiteURLValue.getText() + File.separator + tvApplicationMiddlewareValue.getText() + File.separator + "validateurl.aspx");
        URL url = new URL(urlBuilder.toString());
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
        url = uri.toURL();

        URLConnection urlConn = url.openConnection();
        BufferedReader in = new BufferedReader( new InputStreamReader(urlConn.getInputStream()));

        String inputLine;
        while((inputLine = in.readLine()) != null){
            result += inputLine;
        }                   
        in.close();

        if(result.equals("exists")) {
            validated = true;
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    }

    return validated;
}

(http://www.mydomain.com)変数をhttpsを使用するように変換しようとすると、上記のjava.net.SocketTimeoutExceptionが発生します。

私はこの問題をグーグルで検索し、上記のコードでURLConnectionの代わりにHttpsURLConnectionを実装する必要があることを確認したので、次のようにコードを変更しました。

    protected boolean validateConnectionSettings() {        

    String result = "";
    boolean validated = false;
    try {
        StringBuilder urlBuilder = new StringBuilder();
        urlBuilder.append(tvWebsiteURLValue.getText() + File.separator + tvApplicationMiddlewareValue.getText() + File.separator + "validateurl.aspx");
        URL url = new URL(urlBuilder.toString());
        URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
        url = uri.toURL();

        // URLConnection urlConn = url.openConnection();
        HttpsURLConnection urlConn = (HttpsURLConnection)url.openConnection();
        BufferedReader in = new BufferedReader( new InputStreamReader(urlConn.getInputStream()));

        String inputLine;
        while((inputLine = in.readLine()) != null){
            result += inputLine;
        }                   
        in.close();

        if(result.equals("exists")) {
            validated = true;
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    }

    return validated;
}

しかし、私はまだjava.net.SocketTimeoutExceptionを受け取ります。私が間違っていることについてのアイデアはありますか?

4

1 に答える 1

1

わかりました。SocketTimeOutExceptionの原因となっている問題を見つけました。

問題は、自宅で作業していて、電話がサーバーと同じネットワークを使用していることだったようです。この場合、httpsを使用してサーバーにアクセスできないようです。電話のワイヤレスネットワークをオフにして、電話の3G接続を使用して接続し、アプリを接続してURLを検証しました。

サーバーと仕事用のラップトップから直接Webブラウザーでhttps接続をテストする場合にも同様の問題が発生しました。いずれの場合も、www.mydomain.comアドレスをホストファイルに追加することで問題を修正しました。

私は今、私のアンドロイド電話のホストファイルを編集して、これがそれを解決するかどうかを確認するつもりです。私はテストに電話のG3接続を使用したくないので、多くの料金がかかると予想しています...

後でコメントを投稿して、どうなるかを説明します

これが同様の問題を抱えている他の人に役立つことを願っています

于 2012-07-05T16:43:54.833 に答える