Я написал простой HTTPS-клиент на Java для размещения некоторых данных на сервере.На сервере имеется действительный сертификат, подписанный доверенным центром сертификации, поэтому мне не пришлось связываться с хранилищами ключей или самозаверяющими сертификатами.Вот код:
try
{
String data = "This is a test";
SSLSocketFactory sslFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://my.server.name");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslFactory);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
wr.close();
InputStream ins = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(ins);
BufferedReader in = new BufferedReader(isr);
String inputLine;
String result;
while( (inputLine = in.readLine()) != null )
result += inputLine;
in.close();
}
catch( Exception e )
{
e.printStackTrace();
}
Этот код отлично работает при запуске как часть Java-программы командной строки, но он не работает корректно на Android (по крайней мере, не в эмуляторе).Я проследил проблему до этой строки:
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
Кажется, что вызов conn.getOutputStream()
зависает до истечения времени ожидания соединения на сервере.Это не исключение.Он просто ждет бесконечно, пока не истечет время ожидания соединения на сервере, а затем переходит к wr.write(data)
, но, конечно, это не удается, потому что соединение теперь закрыто.
Кто-нибудь знает, в чем может быть проблема?Я искал проблемы с getOutputStream()
на Android, но ничего полезного пока не нашел.
Спасибо!