Java &引用;非法状态例外:已连接“;使用HttpURLConnection时

Java &引用;非法状态例外:已连接“;使用HttpURLConnection时,java,httpurlconnection,Java,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.gene

当我将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;

    }
我看不出我在发送请求方面有任何错误。有人能指出我遗漏了什么或者我做错了什么吗;
在最后一块中,我得到了同样的问题并解决了它。在我的例子中,这是因为我在NetBeans的调试接口中忘记了监视
connection.getResponseCode()
。希望它能帮助其他犯同样错误的人

如果您有任何与请求响应值相关的监视,例如
getResponseCode()
getResponseMessage()
getInputStream()
,甚至只是
connect()
,您将在调试模式下收到此错误


前面的所有方法都隐式调用
connect()
并触发请求。因此,当您到达
setDoOutput
时,连接已经建立。

有时,只要确保您没有http而不是https,就很容易了。

除了前面评论中提到的手表之外,如果连接有问题,也可能发生这种情况。例如:

我正在设置一个属性:
post.setRequestProperty(“Ocp Apim订阅密钥”)
在写入输出流之后,比如
post.getOutputStream().write(jsonBody.getBytes(“UTF-8”)

就像:

post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
post.getOutputStream().write(jsonBody.getBytes(“UTF-8”))
post.setRequestProperty(“Ocp Apim订阅密钥”,“”)
在这种情况下,我也得到了“已经连接”。为了修复它,我将其制作为:

post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))
post.setRequestProperty(“Ocp Apim订阅密钥”,“”)
post.getOutputStream().write(jsonBody.getBytes(“UTF-8”))

基于HTTPUrlConnection的源代码,它似乎希望在连接打开之前调用这些方法(
setDoOutput
setRequestMethod
),而在调用
conn.connect()
之前不应该调用这些方法。您的代码在结构上也与@Chris类似,我一直在挖掘URLConnection的源代码,看看发生了什么,错误应该不会发生。嗯。。。我自己尝试这一点,无法重现您的问题-我只是将其简化到一个独立的main方法中,将URL硬编码到,称为
URL.openConnection()
,并在没有错误的情况下逐步通过
conn.setDoOutput/conn.setRequestMethod
(在每个步骤中验证
connected==false
)-在调用conn.getOutputStream()
之前,它没有打开。我正在向同一台机器上的tomcat上托管的web应用程序发送请求。这可能会导致问题吗?只有在代码重用open
HttpURLConnection
而不是每次都创建一个新的连接时(根据上面的代码),才应该出现问题。如果您像我一样将问题简化为一个独立的主方法,您是否能够重现问题?如果不是,那么在这里运行的和那个独立类之间显然有一些区别,这应该有助于调试它。代码执行永远不会到达stream.close()。当我调用setDoOutputtry杀死java进程,然后再次测试代码时,就会引发异常!我也遇到了同样的问题,可以肯定的是,我的调试窗口中有一个conn.getResponseCode()的表达式。。。我去掉了这个,它开始工作了。我不知道你为什么投了反对票,但我只是把票投给了汉克斯。我确信这会帮助其他人,因为调试起来并不明显;)谢谢这对我很有帮助,你真了不起,先生。在Eclipse中,我的手表里有着完全相同的表情。感谢分享。令人难以置信的是,有多少开发者落入了同样的陷阱:-)
post.setRequestProperty("Ocp-Apim-Subscription-Key", "<>")
post.getOutputStream().write(jsonBody.getBytes("UTF-8"))