1

我正在编写一个连接到网站并返回 HTML 的 Java 程序,由于某种原因我遇到了问题。现在我只能访问该网站,如果我这样做

 //example     String host = "www.google.com"

但是如果我想访问一个更复杂的 URL,那么我会得到一个 UnknownHostException。起初我认为这可能与它无法识别 URL 中的某些字符有关,但我不确定。例如,这是我试图访问的 URL 之一。

host ="http://www.cyberspacei.com/englishwiz/library/name/etymology_of_first_names.htm";
int port = 80;
Socket s = new Socket(host,port)

....ETC

除了 UnknownHostException 之外,它不会返回任何东西。

有人请帮帮我!!!

4

4 回答 4

5

它失败了,因为你被问到一个主机名,而不是你输入的那个 URL,如果你想要那个 URL 中的文档,你需要使用 URL 类

URL url = new URL("http://www.thesite.com/thefile.html");
Object doc = url.getContent();

当然,您需要用准备缓存该内容的文件替换该“对象文档”。

于 2009-10-10T03:52:12.647 回答
4

Socket 对象的“host”参数指定要连接到网络(互联网)上的哪台机器。这与 Web 浏览器中使用的 URI 不同,该 URI 包括协议、服务器以及所请求文件或对象的目录结构。

Socket s = new Socket("www.cyberspacei.com", "80"); 将为该机器上运行的网络服务器打开一个新的原始套接字,但随后将由您通过该套接字协商 HTTP 协议并请求“/englishwiz/library/name/etymology_of_first_names.htm”

您可以通过使用诸如 HttpClient 之类的库来省去一些麻烦,只要您不需要对 http 流的原始访问,它就可以将大量的腿工作从 http 协商中解脱出来。

http://hc.apache.org/httpclient-3.x/index.html

于 2009-10-10T03:54:26.057 回答
2

我不是 Java 领域的专家,但我知道出了什么问题。

首先,主机变量应该只包含 URL 的主机。

URL的主机http://www.cyberspacei.com/englishwiz/library/name/etymology_of_first_names.htm实际上是'cyberspacei.com'

因此,您连接到主机,然后发送 HTTP 标头以请求您正在寻找的页面。

GET /englishwiz/library/name/etymology_of_first_names.htm HTTP/1.0
Host: cyberspacei.com
Accept: */*
Connection: Close

某些网页可能需要User-AgentReferer标题才能工作。所以适当地添加字段。

于 2009-10-10T03:54:27.767 回答
1

@ONi 就在这里。您正在使用 Socket() 类,这意味着您正在使用原始套接字并且您想要编写自己的 HTTP/Web 服务器请求。您需要更像 URL 类的东西,因为该类“理解”HTTP 请求并只为您提供网站的内容。

这就像从您的计算机(URL 类)打印和阅读电子邮件与将以太网线插入嘴里并尝试用舌头破译信号之间的区别。Socket() 类对于您正在做的事情来说太低级了。

于 2009-10-10T07:07:14.650 回答