我运行了一个程序,用于访问网页,当程序向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();
}
}
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();
}
}
解决方案 »
- 构造函数的类型
- 读取excel的问题?求大家帮忙~
- 对了好几遍代码,没错,不知为什么总报错,帮忙看一下。
- 构造函数里的super()是干什么用的?
- DecimalFormat 格式化显示一个超过17位的大数时,在第17位四舍五入,如何解决?
- 请问:JAVA的FRAME类中如何禁用其最大化按钮
- 如何使用jb7生成的APPLET1.class在ASP中使用
- 100....急!!!
- 哪里可以找到java连接oracle8i的jdbc驱动程序?
- 各位大侠,我刚装了jcreator,编译时提示“You must first create a JDK profile.”请问具体应该如何配置?
- 线程的创建
- 美女的烦恼?
关闭输出流后,我这里可以继续获得数据阿.如果关闭Stream的话,是要抛异常的。
楼主返回null,说明是读不到了,而不是关闭了InputStream。理解没错。找找别的原因吧。
(我用楼主的代码运行过,完全正常)。
为什么我去掉这句话能得到服务器的响应信息(要获取的web页面),而加上却返回null.
public void shutdownOutput()throws IOException
禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。