我运行了一个程序,用于访问网页,当程序向HTTP服务器发送完请求数据后,如果我关闭了输出流socket.shutdownOutput();  见程序红色处,下面的输入流从服务器得不到任何信息。如果不关闭输出流,就可以获得想要的页面信息。我一直不知道原因,既然socket.shutdownOutput();  是半关闭,只关闭输出流,表示客户端不能向服务器输出数据了,它应该不会影响客户端的输入流,应该还可以获取到服务器向客户的输出数据,但为什么程序中获取不到,返回null呢?很糊涂,不知道我哪个地方理解错了,谢谢大家帮忙帮我解答一下。
import java.net.*;
import java.io.*;
public class HTTPClient {
  String host="www.javathinker.org";
  int port=80;
  Socket socket;
  
  public void createSocket()throws Exception{
    socket=new Socket("www.javathinker.org",80);
    //(InetAddress.getLocalHost(),8080);
  }
    public void communicate()throws Exception{
    StringBuffer sb=new StringBuffer("GET "+"/index.jsp "+"HTTP/1.1\r\n");
    sb.append("Host: www.javathinker.org\r\n");
    sb.append("Accept: */*\r\n");
    sb.append("Accept-Language: zh-cn\r\n");
    sb.append("Accept-Encoding: gzip, deflate\r\n");
    sb.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n");
    sb.append("Connection: Keep-Alive\r\n\r\n");    //发出HTTP请求
    OutputStream socketOut=socket.getOutputStream();
    socketOut.write(sb.toString().getBytes());
    //socket.shutdownOutput();  //关闭输出流
      
    //接收响应结果
    InputStream socketIn=socket.getInputStream();
    BufferedReader br=new BufferedReader(new InputStreamReader(socketIn));
    String data;
    while((data=br.readLine())!=null){
      System.out.println(data);
    }
        
    socket.close();
  }
  
  public static void main(String args[])throws Exception{
    HTTPClient client=new HTTPClient();
    client.createSocket();
    client.communicate();
  } 
}

解决方案 »

  1.   

    ?
    关闭输出流后,我这里可以继续获得数据阿.如果关闭Stream的话,是要抛异常的。
    楼主返回null,说明是读不到了,而不是关闭了InputStream。理解没错。找找别的原因吧。
    (我用楼主的代码运行过,完全正常)。
      

  2.   

    谢谢finalzhzhk ,"返回null,说明是读不到了,而不是关闭了InputStream",谢谢对我的提示,我还一直在这个迷惑里.另外,您运行这个程序的时候是加上socket.shutdownOutput();  这句了吧,没有注释掉吧.要是那样,难道是我机器的原因?
       为什么我去掉这句话能得到服务器的响应信息(要获取的web页面),而加上却返回null.
      

  3.   

    你后来有一个socket.close()代码,这句就表示,你把socket的输入输出全部关闭啦,你注释掉这句,这试试看,效果怎么样啊?
      

  4.   

    shutdownOutput
    public void shutdownOutput()throws IOException
    禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。
      

  5.   

    楼主的程序是孙卫琴的书《Java网络编程精解》的例子吧?我运行过,有没有注释半关闭那句话都可以正常运行,收到对方发来的信息。原因可能是我把“   sb.append("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n"); ”中的“Mozilla/4.0 ”改为了“MSIE/6.0”,括号内容去掉。但没这样改的话,在我的机子上也是收到信息的。不知道楼主是不是也因为这个原因而收不到信息。