【问题标题】:"Connection already established" exception in HttpsURLConnectionHttpsURLConnection 中的“已建立连接”异常
【发布时间】:2013-08-01 02:40:43
【问题描述】:

我正在尝试使用HttpsURLConnection 发出 POST 请求,然后得到

java.net.ProtocolException: Connection already established

setRequestMethod 上奇怪的是,conn.connected 刚刚返回 false

我错过了什么?

URL url = new URL("https://ws.audioscrobbler.com/2.0/");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
// here conn.connected is false
conn.setRequestMethod("POST"); // here I get java.net.ProtocolException: Connection already established
conn.setDoInput(true);

编辑

我尝试了 DefaultHttpClient 并且它有效,所以我将使用它。

【问题讨论】:

  • 在 Java 中工作。 conn.connected 是什么?你确定这就是所有的代码吗?
  • developer.android.com/reference/java/net/…。还有更多代码,但在返回异常的行之后。这适用于 HttpURLConnection(不是 https),并且适用于使用 DefaultHttpClient 的 https。
  • 你能解释一下你是如何使用conn.connected的吗?据我所知,在你做url.openConnection()的那一刻,你已经建立了连接。请注意 url.openConnection() 返回 URLConnection 而不是 HttpsURLConnection 的事实。
  • 我在conn.setRequestMethod("POST");上设置断点并检查conn的成员。
  • @haike00 否。TCP 连接在您第一次调用getOutputStream(), getInputStream(),getResponseCode(), 之一时建立,除非它是已建立的池连接。

标签: android httpsurlconnection


【解决方案1】:

对于遇到此问题的其他任何人,我遇到了一个操作顺序问题,该问题仅在我执行包含请求正文中内容的 HTTP POST 时才影响到我。当 HttpURLConnection 实际启动与服务器的连接时,在所有场景中并不完全清楚。

我的初始请求如下所示:

        HttpURLConnection conn = null;
        try
        {
            conn = (HttpURLConnection) baseUrl.openConnection();  
            conn.setConnectTimeout(connectTimeoutMillis);
            conn.setReadTimeout(requestTimeoutMillis);

            //required for reading a response body
            conn.setDoInput(true);

            //Not all request types have a body (e.g. GET usually doesn't)
            if(requestBody != null && requestBody.length > 0)
            {
                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(requestBody.length);
                conn.getOutputStream().write(requestBody);
                conn.getOutputStream().flush();
                conn.getOutputStream().close();
            }

            try
            {
                conn.setRequestMethod(verb.toUpperCase());
            }
            catch (final ProtocolException e)
            {
                response.setError("Invalid HTTP verb \"" + verb + "\" received.","");
                Log.e(TAG, response.errorMessage, e);
                return response;
            }

事实证明,在调用“conn.getOutputStream()”之后,您无法调用“conn.setRequestMethod(...)”,所以在我的情况下,简单的解决方法是调用“conn.setRequestMethod(. ..)”在处理写入请求正文之前。工作代码是:

HttpURLConnection conn = null;
        try
        {
            conn = (HttpURLConnection) baseUrl.openConnection();  
            conn.setConnectTimeout(connectTimeoutMillis);
            conn.setReadTimeout(requestTimeoutMillis);

            //required for reading a response body
            conn.setDoInput(true);

            try
            {
                conn.setRequestMethod(verb.toUpperCase());
            }
            catch (final ProtocolException e)
            {
                response.setError("Invalid HTTP verb \"" + verb + "\" received.","");
                Log.e(TAG, response.errorMessage, e);
                return response;
            }

            //Not all request types have a body (e.g. GET usually doesn't)
            if(requestBody != null && requestBody.length > 0)
            {
                conn.setDoOutput(true);
                conn.setFixedLengthStreamingMode(requestBody.length);
                conn.getOutputStream().write(requestBody);
                conn.getOutputStream().flush();
                conn.getOutputStream().close();
            }

唯一真正的改变就是切换调用的顺序并且消除了异常。希望这能为遇到此问题的其他人解决问题。

【讨论】:

  • 如何在没有 -> conn.setRequestMethod("POST/GET"); 的情况下分配 post get ???
  • @delive 这不是conn.setRequestMethod(verb.toUpperCase()); 的行吗?
  • 如果你把“setRequestMethod”说:连接已经打开,应用程序崩溃!!
  • @delive 你确定你没有使用不正确的第一个例子而不是正确的第二个例子吗?如果你对 OutputStream 对象做过任何事情,即使只是调用getOutputStream(),设置请求方法也为时已晚。
【解决方案2】:

我尝试了DefaultHttpClient 并且它有效,所以我将使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多