如何使用 Java 中的 InetAddress 对象创建 URL 对象?

how to create a URL object using an InetAddress object in Java?

我需要从 Java 中的 IPv4 地址(String 或 InetAddress 对象 - 任何一个都可以)创建一个 http 或 https URL 对象。我已经在这里待了 10 个小时了。

撞墙的尝试如下所述:

  1. 尝试 #1:我试图通过组装一个字符串来制作 URL,然后将其提供给 URL 构造函数。

    • 教科书指出 URL 可以是 "protocol://host",host 可以是主机名或 IP 地址。但是像这样创建 URL:URL a = new URL("http://151.101.65.69"); 并打开流到此 URL (a) 会给出 HTTP 错误 500(内部服务器错误 - 发生意外情况服务器不知道如何处理)。
    • 让我生气的是 URL a = new URL("http://whosebug.com"); 有效。
    • 此时我卡住了。我不知道要改变什么,或者如何前进。
  2. 尝试 #2:我尝试使用 InetAddress class 中的 "getHostName()" 方法对 IP 地址进行反向查找。

    • 这应该 return 通过执行反向 DNS 查找的主机名。然而,我一直在尝试 151.101.65.69(Whosebug 网络服务器 IP 地址),但查找失败。失败我的意思是 IP 地址被 returned 作为字符串而不是主机名作为字符串。我阅读了 Oracle 文档 http://docs.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html#getHostName(),但我不明白如何克服文档中提到的 "security manager"(或者如果这确实是反向查找失败的原因)。
    • 我也试过"getCannonicalHostName()",但是也没用。
  3. 我想知道如何使用 IP 地址打开网站。看起来我的浏览器 运行 遇到了与我的代码相同的问题。我阅读了 How to access site through IP address when website is on a shared host?,但我没有任何用户名,因为我希望能够打开用户拥有 IP 地址的任何网站。添加端口(比如80)好像不行;将用户名留空或使用通用 'user' 或 'guest'.

  4. 也不会

我需要从 IPv4 字符串或 InetAddress 对象创建一个 URL 对象,但我被卡住了。我知道像您这样知识渊博的程序员可能会说从 IP 地址制作 URL 不是 IP 地址的用途,或者指出我没有包括 URL 的文件部分,但这不是目前的问题。你能帮我解决我的核心挑战吗?

以下代码适合我。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;

public class InetAddressMain {

    public static void main(String[] args) {
        try {
            InetAddress addr = InetAddress.getByName("172.217.4.110");

            URL url = new URL("http://"+addr.getHostAddress());
            InputStream is = url.openStream();

            InputStreamReader isReader = new InputStreamReader(is);
            BufferedReader reader = new BufferedReader(isReader);
            String line;
            while((line = reader.readLine()) != null){
                System.out.println(line);
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

输出:

答案由D.B提供。很好。我有非常相似的代码;但是你会发现这段代码并不是每次都有效。您将 IPv4 地址传递给提供的代码 D.B。答案将无法打开 URL 流(例如 Whosebug 的 IP 地址)。我认为问题出在我的编码上,这就是我希望在 Whosebug 上获得帮助的原因。但是我现在意识到问题是我在问这个问题时缺乏理解。我现在明白,拥有 IPv4 地址不足以打开网络上的每个网站。任何时候一个服务器托管多个网站,IP地址可以用来连接服务器,但不能同时识别我们要访问的网站open/access。这位先生解释得很好:http://ask-leo.com/why_doesnt_accessing_a_site_by_its_ip_address_work.html

@D.B。感谢您抽出时间提供帮助。非常感谢!