2015-04-27 17 views
7

kullanırken "Yasadışı Durum İstisnası: Zaten Bağlandı" DoOutput öğesini true olarak ayarladığımda yasadışı durum istisnası alıyorum.HttpURLConnection

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; 

    } 

aynı için görüntülenen yığın izlemesi: Ben isteği göndererek yanlış yapıyorum bir şey görmüyorum

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) 

. Neyin eksik olduğunu veya ne yapmam gerektiğini belirtebilir miyim

+1

HTTPUrlConnection kaynağına dayanarak, bu yöntemlerin ('setDoOutput' ve' setRequestMethod') çağrılmasının * bağlantıdan önce * çağrıldığını beklediğiniz gibi görünüyor.() 'Kodunuz aynı zamanda [URLConnection örnek koduna] benzer yapıya benziyor (https://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html) – Krease

+0

@Chris tam olarak kazıyordum Neler olup bittiğini görmek için URLConnection kaynak kodu etrafında ve hata hiç olmamalı. –

+0

Hmm ... Bunu kendim deniyorum Sorununuzu yeniden oluşturamıyorum - Tek başına bir ana yönteme atamak için onu sadeleştirdim, URL'yi http://docs.oracle.com, url olarak adlandırın. openConnection() 've' conn.setDoOutput/conn.setRequestMethod' üzerinden hata yapmadan (her adımda 'connected == false' olduğunu doğrulayarak) - 'conn.getOutputStream() ' – Krease

cevap

10

Aynı problemi çözdüm ve çözdüm. Benim durumumda, NetBeans'deki hata ayıklama arayüzünde connection.getResponseCode() için unutulmuş bir saatim olduğu için neden oldu. Umarım aynı hatayı yapan başkalarına yardım edebilir.

Eğer isteğin yanıtı değerine herhangi izle akrabası gibi getResponseCode(), getResponseMessage(), getInputStream() hatta sadece connect() varsa, hata ayıklama modunda bu hatayı alırsınız.

Önceki yöntemlerin tümü dolaylı olarak connect() numaralı telefonu arayarak isteği gerçekleştirir. Yani setDoOutput'a ulaştığınızda, bağlantı zaten yapıldı.

+1

Wow! Ben de aynı sorunu yaşıyordum, ve emin bir ifade vardı. conn.getResponseCode() için hata ayıklama pencerem ... Bu kaldırıldı ve işe yaradı. Neden bir downvote aldığınızdan emin değilim, ama ben sadece o kadar tahsis edildi –

+0

Teşekkürler.Bu hata ayıklamak için belli olmadığı için başkalarına yardım edeceğinden emindim;) – Sharcoux

+0

Teşekkürler. Bana yardımcı oldu. – Pegah

-2

stream.close(); nihayetinde bloke edilir.

+1

Kod yürütme hiçbir zaman akışa ulaşmaz .close() istisna ben setDoOutput – arpitpanwar

+0

çağıran java sürecini öldürmeyi deneyin ve daha sonra tekrar kodunuzu test edin ( –

+0

) Birkaç kez denedim istisna kaldırıldı – arpitpanwar

İlgili konular