java - Android 中 URLConnection.getOutputStream() 的问题

标签 java android https

我用 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/

相关文章:

javascript - 有没有办法在 android 的 "web view"中应用 css 或 java 脚本?

c# - 透明代理 - 从端口 80 到 443

java - 如何在我的应用程序中添加 SSL?

http - 我该如何设置才能让人们访问我的 https 网站,而不是 http 版本?

java - AppCompatButton 对 Lollipop 设备没有链式 react

java - 为什么我不能在更改字段的修饰符之前使用方法 get(java.lang.reflect.Field#get)

Java按空格将字符串转换为字符串数组

java - RestTemplate ClientHttpResponse.getBody() 抛出 I/O 错误

android - 我们如何知道 Android 应用程序已关闭?

java.text.ParseException : Unparseable date: java. 文本.DateFormat.parse(DateFormat.java:579)