【问题标题】:how to create a URL object using an InetAddress object in Java?如何在 Java 中使用 InetAddress 对象创建 URL 对象?
【发布时间】:2016-09-18 01:44:31
【问题描述】:

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

下面描述的撞墙尝试:

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

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

    • 这应该通过反向 DNS 查找返回主机名。然而,我一直在尝试 151.101.65.69(stackoverflow Web 服务器 IP 地址),但查找失败。失败是指 IP 地址作为字符串返回,而不是主机名作为字符串返回。我阅读了 Oracle 文档 http://docs.oracle.com/javase/1.5.0/docs/api/java/net/InetAddress.html#getHostName(),但我不明白如何克服文档中提到的“安全管理器”(或者如果这确实是反向查找失败的原因)。
    • 我也尝试了“getCannonicalHostName()”,但也没成功。
  3. 我试图弄清楚如何使用 IP 地址打开网站。看起来我的浏览器遇到了与我的代码相同的问题。我阅读了How to access site through IP address when website is on a shared host?,但我没有任何用户名,因为我希望能够打开用户拥有 IP 地址的任何网站。加个端口(比如80)好像不行;将用户名留空或使用通用的“用户”或“访客”也不行。

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

【问题讨论】:

  • 如果您在 Web 浏览器中加载 http://151.101.65.69 会发生什么?
  • @chrylis 我收到一条错误消息,内容为:“快速错误:未知域:151.101.65.69。请检查该域是否已添加到服务中。”
  • 我忘记在帖子中提及这一点,但我也收到了我尝试过的其他地址的消息,例如 Google 和 Duckduckgo。
  • 您是否从这些错误消息中得出任何推论?
  • 我意识到 IP 地址在 URL 中不能很好地融合。我希望有人会提出一些方法来解决这个问题。也许建议一条路线。

标签: java oracle http url inetaddress


【解决方案1】:

以下代码适用于我。

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

}

输出:

【讨论】:

  • 这个答案很好,但这段代码并不总是有效。请参阅我的回答以全面了解该问题。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多