2016-06-13 4 views
1

Ich versuche, Parameter zu schreiben und die umgeleitete Seite von Input zu lesen, aber ich weiß nichts von dieser AusnahmeHttpURLConnection illegale staatliche Ausnahme: connected bereits

Exception in thread "main" java.lang.IllegalStateException: Already connected 
    at java.net.URLConnection.setDoOutput(URLConnection.java:900) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.setDoOutput(HttpsURLConnectionImpl.java:455) 
    at com.company.Main.main(Main.java:58) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Code:

try { 

     CookieHandler cookieHandler = null; 
     CookieManager.setDefault(cookieHandler); 


     HttpURLConnection urlConnection = (HttpURLConnection) new URL("site").openConnection(); 
     InputStream i = new BufferedInputStream(urlConnection.getInputStream()); 
     StringBuilder stringBuilder =new StringBuilder(); 


     int c; 
     while ((c=i.read())!=-1){ 
      stringBuilder.append((char)c); 
     } 

     // for getting the post paramters that is user name and password field 
     Pattern p = Pattern.compile("<input name=\"\\w{22}\" type=\"text\" id=\"\\w{22}\" />"); 
     Matcher matcher = p.matcher(stringBuilder.toString()); 

     String user_name = null; 
     while (matcher.find()){ 

      user_name = matcher.group().split("\"")[1]; 

     } 

     String password = null; 
     p= Pattern.compile("<input name=\"\\w{22}\" type=\"password\" id=\"\\w{22}\" />"); 
     matcher= p.matcher(stringBuilder.toString()); 
     while (matcher.find()){ 

      password = matcher.group().split("\"")[1]; 

     } 
     System.out.print(user_name + " " + password); 



     String urlParameters = user_name+"=xyz&"+password+"=xyz"; 
     byte[] postData  = urlParameters.getBytes(StandardCharsets.UTF_8); 
     int postDataLength = postData.length; 

     urlConnection.setDoOutput(true); 
     urlConnection.setDoInput(true); 
     urlConnection.setRequestMethod("POST"); 
     urlConnection.setRequestMethod(Integer.toString(postDataLength)); 


     Writer writer = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream())); 
     writer.write(urlParameters); 
     writer.flush(); 

     urlConnection.setDoInput(true); 
     urlConnection.getContent(); 

     while ((c=i.read())!=-1){ 
      System.out.print((char)c); 

     } 


    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Antwort

4

Sie müssen urlConnection.setDoInput(true), urlConnection.setDoOutput(true), urlConnection.setRequestMethod("POST"), urlConnection.setRequestMethod(Integer.toString(postDataLength)) und alle anderen Methoden aufrufen, die die Abfrage ändern, bevor Sie urlConnection.getInputStream() und 0 aufrufenals diese Methoden wird tatsächlich starten die Anfrage so einmal aufgerufen, es ist zu spät, um die Anfrage zu ändern, der Grund ist, warum Sie diese Exception bekommen.

Antwort aktualisieren

Das Hauptproblem, dass Sie tatsächlich konfrontiert sind, auf die Tatsache zurückzuführen ist, dass Sie die HttpURLConnection te wiederverwendet werden soll, während es nicht wieder verwendet werden soll, das heißt, warum Sie diese Ausnahme erhalten, Sie müssen für jede HTTP-Anforderung eine neue HttpURLConnection erstellen.

+0

Eigentlich brauche ich die get Parameter zur Laufzeit caz die Seite, für die ich es verwende, hat es post-Parameter hat session-basierte Verschlüsselung. SO, zuerst muss ich diesen Parameter bekommen und dann muss ich es posten .... Nebenbei habe ich getan, was Sie sagten, aber ich bekomme eine andere Ausnahme, die java.net.ProtocolException ist: Ungültige HTTP-Methode: 60 –

+1

"HttpURLConnection ist nicht zur Wiederverwendung gedacht "Ich muss daran denken, danke! –

+0

@Broken_Window Die meisten Klassen sind nicht zur Wiederverwendung vorgesehen. Ausnahmen davon sind in der Regel selten und irgendwie logisch: Dateihandles, Datenbankhandles, Threads .. – Gewure

Verwandte Themen