【问题标题】:HttpURLConnection: java.lang.IllegalStateException: Already connectedHttpURLConnection:java.lang.IllegalStateException:已经连接
【发布时间】:2014-05-19 13:22:14
【问题描述】:

我正在尝试使用 HttpURLClient 将一些 POST 数据发送到使用下面显示的 HttpRestClient 类的服务器。执行时

conn.setDoInput(true);

我明白了

java.lang.IllegalStateException: Already connected

我卸载了应用程序,但仍然出现同样的错误。

在我见过的所有示例中,openConnection 都是在 setDoInput 之前调用的。如果,顾名思义,openConnection 打开一个连接,它不应该在`setDoInput 之前使用,对吧?我错过了什么?

也许在某个时候它在执行disconnect 之前崩溃了。这可能是原因吗?如果是这样,我该如何断开旧连接?

public class HttpRestClient {
static public int post(String urlStr, List<NameValuePair> data){

    HttpURLConnection conn = null;

    try {

        URL url = new URL(urlStr);


        conn = (HttpURLConnection) url.openConnection();

        conn.setDoInput(true);
        conn.setDoOutput(true);

        conn.setRequestMethod("POST");

        OutputStream os = conn.getOutputStream();
        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
        writer.write(getQuery(data));
        writer.flush();
        writer.close();
        os.close();

        InputStream is = conn.getInputStream();

        String dude = readIt(is);

        return 1;

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return 0;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return 0;
    }
    finally {
        if(conn!=null) conn.disconnect();
    }
}
}

【问题讨论】:

  • 您正在连接的连接由于您使用的静态功能而尚未断开
  • 尝试完全删除conn.connect();(你不需要它)。还是有问题?如果是,请编辑您的帖子并向我们展示堆栈跟踪。
  • @Rod_Algonquin 我看不出关于static 的问题。
  • @hgoebl 谢谢,我删除了无用的conn.connect()
  • @Rod_Algonquin 这似乎不是问题:我尝试使用我的静态函数同时执行多个请求并且它有效,所以我猜它每次都会打开一个不同的连接。

标签: android httpurlconnection


【解决方案1】:

这可能是由于在您的 IDE 中调试时出现的手表。见this answer。 它发生在我身上,很难发现。

【讨论】:

  • 这就是我的答案。非常感谢。
【解决方案2】:

您同时拨打了conn.setDoInput(true);conn.setDoOutput(true);。使用其中之一:

  • setDoOutput(true) 用于 POSTPUT 请求。
  • setDoInput(true) 用于GET 请求。

你建立的连接很混乱,它无法决定应该使用哪个请求。

在您的代码中:

static public int post(String urlStr, List<NameValuePair> data){
    HttpURLConnection conn = null;
    System.setProperty("http.keepAlive", "false"); // must be set
    try {
        ...
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        // and connect to server, if needed
        conn.connect();
        ...
    }
....

【讨论】:

    【解决方案3】:

    这可能是一个误导性的例外。查看 Jersey-2 的这个缺陷 https://java.net/jira/browse/JERSEY-2729

    链接已更新: https://github.com/javaee/jersey/issues/3001

    基本上问题是球衣抛出了无效异常。就我而言,真正的问题是服务器拒绝了连接。

    【讨论】:

    • 链接已损坏。
    • 再次固定链接网址
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2017-02-17
    • 2012-11-08
    • 2023-03-04
    相关资源
    最近更新 更多