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