使用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”这对我来说很有用。嘿,这很好,但我想使用套接字来完成这项工作,因为这是我的任务