套接字使HTML响应无法正常工作

时间:2015-10-23 20:42:59

标签: java

我正在尝试获取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找不到。发生了什么?

3 个答案:

答案 0 :(得分:1)

您是否尝试在此行添加空格?

ps.print("GET /blogsHTTP/1.0\r\n");

我会在博客之后建议一个空格:

ps.print("GET /blogs HTTP/1.0\r\n");

答案 1 :(得分:1)

  1. HTTP / 1.0之前缺少空间
  2. 缺少主持人:行
  3. 在标题末尾缺少\ r \ n(空行)。

答案 2 :(得分:1)

以下为我工作

        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)添加了&#34;主机&#34;头。只要单个Web服务器托管多个网站(共享托管),就需要此标头。这不是谷歌的问题,因为他们不会与其他网站共享他们的服务器。

3)在您的请求结束时添加了最终\ r \ n。规范要求请求结尾处有一个空行。谷歌使用它自己的自定义Web服务器实现,它可以容忍丢失的新行。 Javaworld.com使用Apache Web服务器,这是更严格的。

顺便说一下,你得到的回复是301重定向。使用www.javaworld.com而不是javaworld.com来获取网页的实际HTML。无论哪种方式,通过我给你的三个编辑,你的BufferedReader()都不会挂起。