2011-06-27 48 views
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()的問題,但是我還沒有找到任何有用的東西。

謝謝!

+0

我應該提到應用程序在清單中具有「INTERNET」使用權限,所以這不是問題。 – Dave

+0

似乎適用於https://www.google.com ...您確定它不是服務器問題嗎?在android上引發了什麼異常? – adotout

+0

@adoutout:你在Android模擬器下測試了嗎?我在google.com上看到了相同的行爲,就在調用getOutputStream()時。它不會拋出異常,它只會掛起,直到服務器超時。 – Dave

回答

0

這似乎是Android模擬器的問題。我在我的摩托羅拉Droid上安裝了應用程序,一切正常。這不是真正解決原始問題的答案,但現在(至少對我來說)這個問題是無關緊要的,因爲我可以在手機上測試應用程序。