使用java套接字类获取网页
大家晚上好使用java套接字类获取网页,java,networking,client-server,Java,Networking,Client Server,大家晚上好 我想用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);
我想用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){
}
}
}
但它只是给出了空值
输出
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
我认为代码是有效的,除了你可能看不到输出,因为它被你打印的
null
s淹没了。您应该在第一个null
之后停止while。
一般来说,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);
}
为什么直接使用套接字来执行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);
}
我不确定这是否导致了您的问题,但HTTP希望换行符返回并换行:
dOut.write("GET /index.php HTTP/1.0\r\n\r\n".getBytes());
此外,刷新并关闭DataOutputStream也不会有什么坏处:
dOut.flush();
dOut.close();
如果您打算用这段代码做更多的事情,而不仅仅是连接到简单的测试用例,那么我建议您使用HttpURLConnection,而不是自己在套接字中实现HTTP。否则,结果将不仅仅包含网页。它还将包含HTTP响应,包括状态代码和头。您的代码需要解析它
更新:
查看您添加的响应,302响应以及Location:标头表示您要查找的页面已移动到(请参阅),并且原始URL中不再有任何内容。这是可以设置为由HttpURLConnection或其他类似库自动处理的内容。您将需要解析状态代码、解析标题、打开响应位置的新套接字并获取页面。根据作业的具体要求,您可能希望熟悉,以及。嘿,Flavio ya正在工作,但我无法看到整个页面内容。只向我显示“header”,然后显示“null”,我已将输出添加到问题中。请检查这是真的,但我想用套接字来做这件事,因为我的任务是解析接收到的输出。然后,您需要正确解释URL可以返回的HTTP状态码和响应头。感谢您将URL更改为“xampp/index.php”这对我来说很有用。嘿,这很好,但我想使用套接字来完成这项工作,因为这是我的任务