【问题标题】:What is the correct way to construct InetSocketAddress with any host an IP address?用任何主机 IP 地址构造 InetSocketAddress 的正确方法是什么?
【发布时间】:2012-08-14 09:37:48
【问题描述】:

我想创建一个 InetSocketAddress,但无论我得到一个 host:port 还是一个 ip:port,我都想把它做好。我看到它有两个构造函数,一个用于主机(字符串),另一个用于 IP(InetAddress)。我是否必须确定自己是否获得了 IP 或 HOST 才能在这两个构造函数之间进行选择?我在这里遗漏了什么吗?

【问题讨论】:

  • 您应该记住的唯一一件事(如果它对您很重要),IP 地址会很快,因为它们不需要解析。

标签: java sockets networking tcp network-programming


【解决方案1】:

您可以从 Javadoc 中推断,并在源代码中看到 new InetSocketAddress(String hostname, int port) 调用 InetAddress.getByName(hostname),这会按照文档为您整理好所有内容。

因此,您发布的问题实际上并不存在。只需传递您获得的任何字符串,无论是主机名还是 IP 地址。

【讨论】:

    【解决方案2】:

    我不完全确定你的要求是什么,但是,我在我的电脑上做了这个快速测试,没有任何问题

    try {
    
        String ipAddress = ""; // Add your own
        String hostName = ""; // Add your own
    
        int port = ...; // You'll need some sort of service to connect to
    
    
        InetSocketAddress byAddress1 = new InetSocketAddress(ipAddress, port);
        InetSocketAddress byAddress2 = new InetSocketAddress(InetAddress.getByName(ipAddress), port);
    
        InetSocketAddress byName1 = new InetSocketAddress(hostName, port);
        InetSocketAddress byName2 = new InetSocketAddress(InetAddress.getByName(hostName), port);
    
    } catch (UnknownHostException unknownHostException) {
        unknownHostException.printStackTrace();
    }
    

    更大的问题是,期望得到什么作为输入? IP 地址、主机名或其他形式??

    【讨论】:

    • 没关系。看我的回答。
    【解决方案3】:

    您必须确定传递给构造函数的字符串是 IP 还是主机名。我会用 IP 地址的正则表达式来做。如果失败,则可能是主机名。

    IP 地址和主机名都是字符串,所以你将只使用一个构造函数。

    【讨论】:

    • 你可以让类抛出 UnknwnHostException 并以这种方式处理它,消除了一些复杂性,但仍会归结为需求。不错的建议;)
    • 为什么要这样做?
    【解决方案4】:

    另外值得一提的是,如果您不知道您的 dns 名称或 ip,您可以简单地使用仅带有端口的构造函数。

    new InetSocketAddress(8080)
    

    它在内部调用InetAddress.anyLocalAddress()

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 2014-08-19
      • 2010-12-10
      • 2012-11-24
      • 1970-01-01
      • 2014-11-22
      • 2018-09-25
      相关资源
      最近更新 更多