大家晚上好
我想在java中使用socket类获取一个网页,我已经这样做了
import java.net.*;
import java.io.*;
class htmlPageFetch{
public static void main(String[] args){
try{
Socket s = new Socket("127.0.0.1", 80);
DataInputStream dIn = new DataInputStream(s.getInputStream());
DataOutputStream dOut = new DataOutputStream(s.getOutputStream());
dOut.write("GET /index.php HTTP/1.0\n\n".getBytes());
boolean more_data = true;
String str;
while(more_data){
str = dIn.readLine();
if(str==null)
more_data = false;
System.out.println(str);
}
}catch(IOException e){
}
}
}
但它只是给出了null。
输出
HTTP/1.1 302 Found
Date: Wed, 01 Dec 2010 13:49:02 GMT
Server: Apache/2.2.11 (Unix) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8k PHP/5.2.9 mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
X-Powered-By: PHP/5.2.9
Location: http://localhost/xampp/
Content-Length: 0
Content-Type: text/html
null
答案 0 :(得分:2)
我不确定这是否会导致您的问题,但HTTP需要回车和换行换行:
dOut.write("GET /index.php HTTP/1.0\r\n\r\n".getBytes());
此外,刷新和关闭DataOutputStream也不会有什么坏处:
dOut.flush();
dOut.close();
如果你打算用这个代码做更多的事情,而不仅仅是连接到简单的测试用例,我建议你使用HttpURLConnection,而不是自己在套接字中实现HTTP。否则,结果将不仅仅包含网页。它还将包含HTTP响应,包括状态代码和标头。您的代码需要解析它。
<强>更新强>
查看您添加的回复,该302回复以及Location:标头表示您要查找的网页已移至http://localhost/xampp/(请参阅HTTP 302),并且不再有任何内容原始网址。这可以设置为由HttpURLConnection或其他库(如Apache HttpClient)自动处理。您将需要解析状态代码,解析标题,打开响应位置的新套接字并获取页面。根据作业的具体要求,您可能希望自己熟悉HTTP 1.0 Specification和HTTP 1.1 Specification。
答案 1 :(得分:1)
我认为代码正在运行,除非您没有看到输出,因为它被您打印的所有null
所淹没。你应该在第一个null
之后停下来。
更一般地说,DataInputStream
和DataOutputStream
不适合这项工作。试试这段代码。
public static void main(String[] args) throws IOException {
Socket s = new Socket("127.0.0.1", 80);
BufferedReader dIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream dOut = new PrintStream(s.getOutputStream());
dOut.println("GET /index.php HTTP/1.0");
dOut.println();
String str = null;
do {
str = dIn.readLine();
System.out.println(str);
} while (str != null);
}
答案 2 :(得分:0)
为什么直接使用套接字来执行HTTP连接?这是很好的练习,但它需要深入了解HTTP协议的内部。为什么不只是使用类URL和URLConnection?
BufferedReader dIn = new BufferedReader(new URL("http://127.0.0.1:80").openConnection().getInputStream());
do {
str = dIn.readLine();
System.out.println(str);
} while (str != null);
}