web-dev-qa-db-fra.com

"Exception d'état illégal: déjà connecté" lors de l'utilisation de HttpURLConnection

J'obtiens une exception d'état non conforme lorsque je règle DoOutput sur 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;

    }

La trace de pile affichée pour le même est:

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)

Je ne vois rien que je me trompe en envoyant la demande. Quelqu'un pourrait-il indiquer ce qui manque ou ce que je fais mal

8
arpitpanwar

J'ai eu le même problème et l'ai résolu. Dans mon cas, cela était dû au fait que j'avais une surveillance oubliée pour connection.getResponseCode() dans mon interface de débogage sous NetBeans. J'espère que cela pourra aider les autres à faire la même erreur.

Si vous avez une surveillance relative à la valeur de réponse de la demande, telle que getResponseCode(), getResponseMessage(), getInputStream() ou même simplement connect(), vous obtiendrez cette erreur en mode de débogage.

Toutes les méthodes précédentes appellent implicitement connect() et déclenchent la demande. Ainsi, lorsque vous atteignez setDoOutput, la connexion est déjà établie.

24
Sharcoux

parfois, il est aussi facile de s’assurer que vous n’avez pas http au lieu de https.

0
sawa we