web-dev-qa-db-ja.com

HttpURLConnection:Java.lang.IllegalStateException:すでに接続されています

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

これは、IDEでのデバッグ中の監視が原因である可能性があります。 この回答 を参照してください。それは私に起こり、発見するのは困難でした。

13
Sharcoux

conn.setDoInput(true);conn.setDoOutput(true);の両方を呼び出しました。それらの1つを使用してください:

  • setDoOutput(true)POSTおよびPUTリクエストに使用されます。
  • 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();
        ...
    }
....
4
Anggrayudi H

誤解を招く例外かもしれません。 Jersey-2のこの欠陥を参照してください https://Java.net/jira/browse/JERSEY-2729

リンクが更新されました: https://github.com/jersey/jersey/issues/3001

基本的に問題は、ジャージが無効な例外をスローしていたことです。私の場合の本当の問題は、サーバーからの接続が拒否されたことでした。

1
roneo