簡體   English   中英

httpurlconnection非法狀態異常:已連接

[英]httpurlconnection illegal state exception : already connected

我正在嘗試發布參數並從inputstream中讀取重定向的頁面,但我不知道任何有關此異常的信息

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)

碼:

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();
    }

您需要在調用urlConnection.setDoInput(true)調用urlConnection.setDoInput(true)urlConnection.setDoOutput(true)urlConnection.setRequestMethod("POST")urlConnection.setRequestMethod(Integer.toString(postDataLength))和任何其他更改查詢的方法urlConnection.getInputStream()urlConnection.getOutputStream()因為這些方法實際上會啟動請求,因此一旦調用,修改請求就為時已晚,這就是得到此Exception的原因。

回應更新

您實際上面臨的主要問題是由於您想要重用HttpURLConnection而不是要重用的事實,這就是為什么出現此異常的原因,您需要為每個HTTP請求創建一個新的HttpURLConnection

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM