web-dev-qa-db-ja.com

「Illegalstateexception:Already Connected」がHttpURLConnectionを使用する場合

DoOutputをtrueに設定すると、不正な状態の例外が発生します。

public boolean sendLinksToMaster(String ipport, List<String> links){

        boolean sent = false;
        String[] tokens = ipport.split(":");    
        String data = edu.cis555.searchengine.utils.Utils.generateLinks(links);
        HttpURLConnection conn=null;
        try{
            String encodedData = URLEncoder.encode(data, "UTF-8");
        try{

                String ip =tokens[0];
                String port = tokens[1];
                String path = edu.cis555.searchengine.utils.Constants.URL_ADD_LINK;
                System.setProperty("http.keepAlive", "false");
                URL u = new URL("http", ip, Integer.parseInt(port),"/"+path);

                conn = (HttpURLConnection)u.openConnection();
                //ERROR IN THIS LINE
                conn.setDoOutput(true);
                conn.setRequestMethod("POST");
                OutputStream stream = conn.getOutputStream();
                stream.write(encodedData.getBytes());
                stream.close();

                if(conn.getResponseCode() == HttpURLConnection.HTTP_OK)
                    sent=true;

            //  LOG.debug(conn.getResponseCode());
                conn.disconnect();
            }catch(MalformedURLException mfe){
                LOG.debug(mfe.getMessage());
                if(conn!=null){
                    conn.disconnect();
                }
            }catch(IOException ioe){
                LOG.debug(ioe.getMessage());
                if(conn!=null){
                    conn.disconnect();
                }
            }

        }catch(Exception e){
            LOG.debug(e.getMessage());
            if(conn!=null){
                conn.disconnect();
            }
        }
        return sent;

    }

同じように表示されるスタックトレースは次のとおりです。

Java.lang.IllegalStateException: Already connected
at Java.net.URLConnection.setDoOutput(Unknown Source)
at edu.upenn.cis455.xpathengine.utils.pool.ThreadPool.sendLinksToMaster(ThreadPool.Java:357)
at edu.upenn.cis455.xpathengine.utils.pool.ThreadPool$Worker.processAndAddToQueue(ThreadPool.Java:314)
at edu.upenn.cis455.xpathengine.utils.pool.ThreadPool$Worker.run(ThreadPool.Java:269)
at Java.lang.Thread.run(Unknown Source)

リクエストの送信に関して間違っていることは何もありません。誰かが欠けているものや私が間違っていることを指摘できますか

14
arpitpanwar

同じ問題が発生して解決しました。私の場合、NetBeansのデバッグインターフェースでconnection.getResponseCode()の監視を忘れていたために発生しました。それが他の人が同じ間違いをするのを助けるかもしれないことを願っています。

getResponseCode()getResponseMessage()getInputStream()、またはconnect()などのリクエストの応答値に関連するウォッチがある場合、このエラーはデバッグモードで発生します。

以前のすべてのメソッドは暗黙的にconnect()を呼び出し、要求を発行します。したがって、setDoOutputに到達すると、接続はすでに確立されています。

37
Sharcoux

前のコメントで述べた時計以外に、接続に問題がある場合にも発生する可能性があります。例えば:

post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")のようにOutPutストリームに書き込んだ後、私はプロパティを設定していました:post.getOutputStream().write(jsonBody.getBytes("UTF-8"));

それは次のようでした:

post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")

この場合、「接続済み」も表示されていました。それを修正するために、私はそれを次のようにしました:

post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
1
Rahul jha

場合によっては、httpsではなくhttpがないことを確認するのと同じくらい簡単です。

0
sawa we