HttpURLConnection:java.lang.IllegalStateException:已经连接

时间:2014-05-19 13:22:14

标签: android httpurlconnection

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

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();
    }
}
}

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:3)

您同时调用了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();
        ...
    }
....

答案 2 :(得分:1)

这可能是一个误导性的例外。请参阅Jersey-2 https://java.net/jira/browse/JERSEY-2729

的此缺陷