想要编写一个程序使用post方法将要查询的结果以及查询图片的初始序号,传递给
google图片搜索,但是建立连接后程序无法实现post,显示如下出错信息:F:\WorkPlace>javac URLConnectionTest.javaF:\WorkPlace>java URLConnectionTest
null: HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Thu, 15 Mar 2007 11:41:56 GMT
Set-Cookie: PREF=ID=160fac079b38626a:NW=1:TM=1173958916:LM=1173958916:S=-
eEV0lnw
Content-Type: text/html; charset=ISO-8859-1
Server: GWS/2.1
Cache-Control: private
----------
getContentType: text/html; charset=ISO-8859-1
getContentLength: -1
getContentEncoding: null
getDate: 1173958916000
getExpiration: 0
getLastModifed: 0
----------
Exception in thread "main" java.lang.IllegalStateException: Already connected
        at java.net.URLConnection.setDoOutput(URLConnection.java:849)
        at URLConnectionTest.main(URLConnectionTest.java:66)
百思不得其解,求教大家,谢谢!程序如下:
import java.io.*;
import java.net.*;
import java.util.*;public class URLConnectionTest
{  
   public static void main(String[] args)
   {  
      try
      {  
         String urlName;
         if (args.length > 0)
            urlName = args[0];
         else
            urlName = "http://images.google.com/ ;
         String query,start;
         if (args.length > 1)
          query = args[1];
         else
          query = "human+face";
         if (args.length > 2)
          start = args[2];
         else
          start = "0";         URL url = new URL(urlName);
         URLConnection connection = url.openConnection();         connection.connect();         // print header fields         Map<String, List<String>> headers = connection.getHeaderFields();
         for (Map.Entry<String, List<String>> entry : headers.entrySet())
         {
            String key = entry.getKey();
            for (String value : entry.getValue())
               System.out.println(key + ": " + value);
         }         // print convenience functions         System.out.println("----------");
         System.out.println("getContentType: " + connection.getContentType());
         System.out.println("getContentLength: " + connection.getContentLength
());
         System.out.println("getContentEncoding: " + 
connection.getContentEncoding());
         System.out.println("getDate: " + connection.getDate());
         System.out.println("getExpiration: " + connection.getExpiration());
         System.out.println("getLastModifed: " + connection.getLastModified());
         System.out.println("----------");
         
         
         connection.setDoOutput(true);

 StringBuffer send = new StringBuffer();
 send.append("images?");
 send.append('&');
 send.append('q');
 send.append('=');
 send.append(URLEncoder.encode(query,"UTF-8"));
 send.append('&');
 send.append("start");
 send.append('=');
 send.append(URLEncoder.encode(start,"UTF-8"));

 OutputStreamWriter out = new OutputStreamWriter
(connection.getOutputStream(),"ASCII");
 out.write(send.toString());
 out.write("\r\n");
 out.flush();
 out.close();
                  Scanner in = new Scanner(connection.getInputStream());         // print  contents         while(in.hasNextLine()){
            System.out.println(in.nextLine());
            }
        }
      catch (IOException e)
      {  
         e.printStackTrace();
      }
   }
}
  

解决方案 »

  1.   

    刚才自己看了java API的文档,发现:public class IllegalStateExceptionextends RuntimeException在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 检查程序发现,要发送post请求,应该紧接在下面语句之后:
    URLConnection connection = url.openConnection();但是修改后又出现了新的错误:F:\WorkPlace>javac URLConnectionTest.javaF:\WorkPlace>java URLConnectionTest
    java.io.IOException: Server returned HTTP response code: 501 for URL: http://ima
            at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLCon
            at URLConnectionTest.main(URLConnectionTest.java:74)
      

  2.   

    我的是1.4JDK,不能编译你的代码.
      

  3.   

    刚才对程序后部分进行了修改,可是还是那个错误,修改后如下:
    import java.io.*;
    import java.net.*;
    import java.util.*;public class URLConnectionTest
    {  
       public static void main(String[] args)
       {  
          try
          {  
             String urlName;
             if (args.length > 0)
                urlName = args[0];
             else
                urlName = "http://images.google.com/";
             String query,start;
             if (args.length > 1)
              query = args[1];
             else
              query = "human+face";
             if (args.length > 2)
              start = args[2];
             else
              start = "0";         URL url = new URL(urlName);
             URLConnection connection = url.openConnection();         connection.setDoOutput(true);

     StringBuffer send = new StringBuffer();
     send.append("images?");
     send.append('&');
     send.append('q');
     send.append('=');
     send.append(URLEncoder.encode(query,"UTF-8"));
     send.append('&');
     send.append("start");
     send.append('=');
     send.append(URLEncoder.encode(start,"UTF-8"));

     OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(),"ASCII");
     out.write(send.toString());
     out.write("\r\n");
     out.flush();
     out.close();
                      InputStream in = connection.getInputStream();
             InputStreamReader read = new InputStreamReader(in);         // print  contents  int c;
             while((c = read.read()) != -1){
                System.out.print((char) c);
                }
            }
          catch (IOException e)
          {  
             e.printStackTrace();
          }
       }
    }
      

  4.   

    更要命的是google那个网页的URL似乎很不稳定,所以本人无法确定我post的内容是否合法,郁闷
      

  5.   

    对于它返回的错误信息,对于我的请求,它相应的回应没有实现!?(我是这样理解的),
    我觉得很费解,因为我最初的想法是,我最初连接对象是“image.google.com”,然后我只
    要用post在后面加上“images?&q=human+face&start=0”,它就应该像回应浏览器(如IE)
    那样回应我,这样我就可以得到我想要的信息了,我的想法究竟错在什么地方呢?希望大家
    指正,谢谢!
      

  6.   

    行了一番苦苦改进,最终发现,我用原来的程序(可能有细微改动),可以正常一些
    网站,但是google不行,也就是google的返回结果我无法接受,请教高手应该如何接收呢?
    十分感谢!