SocketTimeoutException после преобразования с http на https в приложении для Android

У меня возникают некоторые проблемы после попытки преобразовать мое приложение для Android для использования SSL для передачи информации между моим приложением для Android и веб-сервером. (SocketTimeOutException)

Я купил сертификат Positive SSL в центре сертификации (ЦС) и настроил свой сервер для правильной работы с ним. Я проверил его в своем веб-браузере, и он работает правильно.

Теперь я пытаюсь изменить свое приложение для Android, чтобы использовать https вместо http, но, поскольку я впервые сам использовал https, я немного смущен тем, какие шаги мне нужно реализовать в java-коде.

В настоящее время я работаю над своей страницей настроек, где я настраиваю свое приложение для использования правильного URL-адреса. Например, у меня есть 2 текстовых поля в действии, где я ввожу URL-адрес веб-сайта (http://www.mydomain.com) и папку приложения, в которой хранятся соответствующие страницы (папка myapp).

Затем я использую следующий код для подключения и проверки правильности настройки переменных подключения, где validateurl.aspx — это веб-страница, которая возвращает строку JSON, если страница существует:

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.

Я погуглил эту проблему и увидел, что мне следует реализовать HttpsURLConnection вместо URLConnection в приведенном выше коде, поэтому я изменил свой код следующим образом:

    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. Любые идеи, что я делаю неправильно?


person Comic Coder    schedule 05.07.2012    source источник


Ответы (1)


Хорошо, я нашел проблему, которая вызывала исключение SocketTimeOutException.

Похоже, проблема была в том, что я работаю дома, а телефон использует ту же сеть, что и сервер. В этом случае невозможно получить доступ к серверу по https. Я выключил беспроводную сеть телефона и подключился с помощью 3G-соединения телефона, и, вуаля, приложение подключилось и подтвердило мой URL-адрес.

У меня были аналогичные проблемы с тестированием https-соединения непосредственно с сервера и моего рабочего ноутбука в веб-браузере. В каждом случае я исправлял проблему, добавляя адрес www.mydomain.com в файл хоста.

Теперь я собираюсь изучить редактирование хост-файла моего телефона Android, чтобы увидеть, решит ли это проблему, поскольку я не хочу использовать соединение телефона G3 для тестирования, так как я ожидаю, что я получу много зарядов ...

Позже я опубликую комментарий ниже, чтобы сказать, как это происходит

Я надеюсь, что это поможет всем, у кого есть подобные проблемы

person Comic Coder    schedule 05.07.2012
comment
хорошо, после рутирования моего телефона по следующей ссылке androidauthority. com/how-to-root-your-samsung-galaxy-ace-37385, а затем загрузить и использовать приложение Hosts Editor из Google Play. Мне удалось отредактировать файл хоста и добавить IP-адрес и псевдоним моего веб-сервера. Это сработало, и теперь я могу подключиться к веб-серверу, используя https в своей внутренней сети. - person Comic Coder; 06.07.2012