我正在尝试获取www.javaworld.com/blogs的html,但是它不起作用。我试图查询谷歌,那是可行的。 GET请求有效,但缓冲的阅读器似乎卡在String str = br.readLine();
处该怎么办?
这是我的代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class GetAllHtml {
public static void main(String[] args){
try {
Socket s = new Socket("javaworld.com",80);
PrintStream ps = new PrintStream(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
ps.print("GET /blogsHTTP/1.0\r\n");
ps.print("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n");
ps.flush();
String html = "";
String str = br.readLine();
while(str != null){
html += str;
str = br.readLine();
System.out.println(str);
}
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
提前致谢!
仅供参考,当我运行此代码时,我得到以下结果:
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /blogsHTTP/1.0 was not found on this server.</p>
</body></html>
null
编辑:现在它不停留在readLine()(感谢EJP),但它返回404找不到。发生了什么?
最佳答案
以下为我工作
ps.print("GET /blogs HTTP/1.0\r\n");
ps.print("Host: www.javaworld.com\r\n");
ps.print("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n");
ps.print("\r\n");
ps.flush();
1)在/ blogs和HTTP / 1.0之间添加了一个空格(当您发布问题时可能是拼写错误)
2)添加了“主机”标题。只要单个Web服务器托管多个网站(共享托管),就需要此标头。对于Google而言,这不是问题,因为他们不与其他网站共享服务器。
3)在请求末尾添加了最后一个\ r \ n。规范要求在请求末尾有一个空行。 Google使用自己的自定义Web服务器实现,可以容忍缺少的新行。 Javaworld.com使用更严格的Apache Web服务器。
顺便说一句,您得到的响应是301重定向。使用www.javaworld.com而不是javaworld.com来获取网页的实际HTML。无论哪种方式,通过我给您的三个编辑,您的BufferedReader()都不会挂起。