使用java套接字类获取网页

时间:2010-12-01 13:37:12

标签: 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);
                        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

3 个答案:

答案 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 SpecificationHTTP 1.1 Specification

答案 1 :(得分:1)

我认为代码正在运行,除非您没有看到输出,因为它被您打印的所有null所淹没。你应该在第一个null之后停下来。  更一般地说,DataInputStreamDataOutputStream不适合这项工作。试试这段代码。

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);
}