2
我已經用Java編寫了一個簡單的HTTPS客戶端來將一些數據發佈到服務器。服務器具有由可信CA簽署的有效證書,因此我不必混淆任何密鑰庫或自簽名證書。下面是代碼:當作爲命令行Java程序的一部分運行Android中URLConnection.getOutputStream()的問題
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();
}
此代碼工作正常,但它不能正常在Android(至少不會在模擬器)工作。我已經查明問題這一行:
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
到conn.getOutputStream()
調用似乎掛起,直到連接超時在服務器上。它不會拋出異常。它只是無限期地等待,直到服務器上的連接超時,然後移動到wr.write(data)
,但這當然會失敗,因爲連接現在已關閉。
有誰知道這個問題可能是什麼?我在Android上搜索了關於getOutputStream()
的問題,但是我還沒有找到任何有用的東西。
謝謝!
我應該提到應用程序在清單中具有「INTERNET」使用權限,所以這不是問題。 – Dave
似乎適用於https://www.google.com ...您確定它不是服務器問題嗎?在android上引發了什麼異常? – adotout
@adoutout:你在Android模擬器下測試了嗎?我在google.com上看到了相同的行爲,就在調用getOutputStream()時。它不會拋出異常,它只會掛起,直到服務器超時。 – Dave