我用 Java 编写了一个简单的 HTTPS 客户端来将一些数据发送到服务器。服务器具有由受信任的 CA 签名的有效证书,因此我不必弄乱任何 keystore 或自签名证书。这是代码:
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)
但这当然会失败,因为连接现在已关闭。
有人知道问题出在哪里吗?我在 Android 上搜索了关于 getOutputStream()
的问题,但我还没有找到任何有用的东西。
谢谢!
最佳答案
这似乎是 Android 模拟器的问题。我在我的摩托罗拉 Droid 上安装了该应用程序,一切正常。这并不是原始问题的真正答案,但现在(至少对我来说)这个问题已经无关紧要了,因为我可以在我的手机上测试该应用程序。
关于java - Android 中 URLConnection.getOutputStream() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6488160/