代码之家  ›  专栏  ›  技术社区  ›  Basilevs

InetAddress是否可以表示无法解析的主机名?

  •  2
  • Basilevs  · 技术社区  · 14 年前

    我分析各种包含网络信息的数据源。

    java.net.InetAddress 表示和分析主机。用IP初始化它可以很好地工作。

    我现在要分析一个新的来源。它包含主机名而不是IP。 InetAddress.getByName() 如果主机名参数无法解析为IP,则引发UnknownHostException。主机IP对我的目标不是绝对必要的。仅仅因为DNS失败而删除数据对我来说是不可接受的。

    我想有一个IP地址,如果它是可以获得的或主机名。

    如何防止解析给定的主机名?还有更适合我的课程吗?

    5 回复  |  直到 14 年前
        1
  •  1
  •   Michael Konietzka    14 年前

    我想这是不可能的,因为InetAddress的核心功能是处理IP地址:

    协议(IP)地址。

    IP地址是32位或 IP使用的128位无符号数,a 低层协议 建立了UDP和TCP等协议。 按RFC 790:分配编号,RFC 1918:私有地址分配 互联网,RFC 2365:行政管理 作用域IP多播和RFC 2373:IP 版本6寻址架构。一个 一个IP地址,可能还有它的 相应的主机名(取决于 是否由主机构造 名称或是否已完成

    如果没有IP地址,就不可能构造InetAddress对象。

    为此,您需要定义Hostname.class,它保存主机名和其他数据。这个类应该/可以通过 IDN ,如果您使用的是Java6。如果您使用的是Java5,则可以使用单独的IDN库。

    单独的Hostname.class还可以定义保护或构造函数,根据相关的RFC,这些保护或构造函数只能确保有效的主机名。

        2
  •  2
  •   Giacomo Verticale    14 年前

    InetAddress.getByAddress(String host, byte[] addr) 不执行对DNS的查询,并允许您创建 InetAddress

    尝试创建 具有 getByName ,如果它抛出,则可以使用 getByAddress . 请注意,在实际使用IP地址之前,您需要检查IP地址是否有效。


    示例代码:

      public static void main(String arg[])
        throws  UnknownHostException
      {
        InetAddress a;
        byte[] unspec = new byte[4];
        unspec[0]=0;
        unspec[1]=0;
        unspec[2]=0;
        unspec[3]=0;
        try
        {
          a = InetAddress.getByName(arg[0]);
        }
        catch(UnknownHostException e)
        {
          a = InetAddress.getByAddress(arg[0],unspec);
        }
        System.out.println(a);
      }
    
        3
  •  0
  •   thejh    14 年前

    写一门新课怎么样?它只需要能够存储一个字符串和一个InetAddress。

        4
  •  0
  •   jaison    9 年前

    /etc/hosts 文件:

    我也有类似的问题( InetAddress.getByName

    我通过删除 ::1 localhost , ff81::1%lo0 localhost

    我删除了localhost的其余条目。我是为我的Mac做的。

        5
  •  -1
  •   Roman    14 年前

    我刚做了一些实验 InetAddress 类并阅读其javadocs。

    UnknownHostException 在两种情况下:当我传递非法的格式化字符串(比如 http://stackoverflow.com 而不是 stackoverflow.com )或者当我传递不能在浏览器中解析的URL时(例如 aosjdfk23423.com ).

    这两种情况都记录在javadocs中(尽管没有明确指出任何地方对参数格式有任何严格要求)。以下是相关的javadocs部分:

    java.sun.com ,或其文本表示 IP地址。如果提供了文本IP地址,则只有

    @如果没有 host 无法找到,或者指定了作用域id

    总结:

    这是有效的:

    InetAddress.getByName("google.com");
    InetAddress.getByName("74.125.87.99");
    

    然后这个扔 未知幻觉

    InetAddress.getByName("http://google.com");
    InetAddress.getByName("unexistingresourse234234.com");
    

    UPD(作为对评论的回答:应该有这样的东西:

    List<String> hosts = getPossibleHosts(); //these are all hosts you want to transform into inet addresses
    final List<InetAddress> inetAddresses = new LinkedList<InetAddress>();
    final List<String> badHosts = new LinkedList<String>();
    
    for(String host : hosts) {
        try {
            inetAddresses.add(InetAddress.getByName(host));
        } catch (UnknownHostException e) {
            badHosts.add(host);
        }
    }
    

    之后,你可以按自己的意愿处理这两个列表。但把它们放在同一个清单上是错误的——它们不一样。