1

我已经浏览了所有相关的帖子,试图弄清这个问题的根源,但并不清楚——希望有人能把我从痛苦中解救出来……</p>

我正在尝试让 Android 2.3 通过代理通过 HTTPS 发布。此代码通过代理在 2.2 上完美运行,并且在不通过代理时使用 HTTPS 在 2.2 和 2.3 上完美运行,并且在所有情况下(2.2 和 2.3)我都可以通过代理通过 HTTPS 获取。它只是通过代理使用 HTTPS 的 2.3 POST,这似乎是问题所在。我得到了可怕的“断管”错误。当我尝试从连接读取输入流响应时抛出错误 - 大概是因为 TCP 套接字已在我的流下方关闭。我已经尝试了所有我能想到的方法,包括使用 Connection 和 Proxy-connection 标头(设置为关闭和保持活动状态)和设置大的 readTimeout 数字(30 秒)。从我不懈的谷歌搜索中,我可以看到 Android 2.3 上的 SSL 存在已知问题,但我不能 似乎找不到任何暗示为什么 POST 可能是一个问题的东西。Wireshark 已经取得了一些成果,但考虑到这是 SSL,如果解决这个问题有点棘手的话。

有没有人看到这个。我正在使用 HttpsURLConnection,因为各种帖子表明这比 AndroidHttpClient 更稳定。这是我的代码……任何帮助都是无价的。谢谢

urlConnection.setSSLSocketFactory(factory);     
urlConnection.setHostnameVerifier(new AllowAllHostnameVerifier() );

String dateText = "{\"loopParam\":\"" + String.valueOf(d.getHours()) + ":" +   String.valueOf(d.getMinutes()) + ":" + String.valueOf(d.getSeconds())  + "\"}";
                txtOutput.setText("Sending " +     String.valueOf(dateText.length() ) + " bytes of JSON to /pulse/loop" );

urlConnection.addRequestProperty("Content-type", "application/json");
                urlConnection.setDoOutput(true);
urlConnection.setRequestProperty("Proxy-connection", "Keep-Alive");
urlConnection.setRequestProperty("Connection", "Keep-Alive");
                urlConnection.setDoInput(true);
                urlConnection.setUseCaches(false);
                urlConnection.setReadTimeout(30000);
                urlConnection.setRequestMethod("POST");
                DataOutputStream dataOut = new     DataOutputStream(urlConnection.getOutputStream());
                dataOut.writeBytes(dateText);
                dataOut.flush();

BufferedReader bufIn = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            String sResponse;
            StringBuilder s = new StringBuilder();

         //bufIn is null as error as closed urlcConnection
            while ((sResponse = bufIn.readLine()) != null) {
                s = s.append(sResponse);
            }

错误详细信息:08-May-12 09:09:51 SsliferSnifferActivity 通过代理 INFO 连接

08-May-12 09:09:54 SsliferSnifferActivity javax.net.ssl.SSLException: Write error: ssl=0x2d42b8: I/O error during system call, Broken pipe
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:837)
at java.io.OutputStream.write(OutputStream.java:80)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.writeRequestHeaders(HttpURLConnectionImpl.java:799)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1028)
at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726)
at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:110)
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity.makeRequest(SslifersnifferActivity.java:236)
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity.access$2(SslifersnifferActivity.java:148)
at uk.co.flurrished.sslifersniffer.SslifersnifferActivity$2.onClick(SslifersnifferActivity.java:76)
at android.view.View.performClick(View.java:2485)
at android.view.View$PerformClick.run(View.java:9080)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3822)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)

编辑:这看起来是由服务器引发 400(错误请求)并关闭管道引起的。当通过导致 400 的代理路由时添加额外内容的 Android 2.3 是怎么回事?

4

1 回答 1

2

“断管”只有一个意思。您已写入已被另一端关闭的连接。你确定对方真的在说 SSL 吗?

于 2012-05-10T01:54:48.873 回答