如何正确构造带有任意主机和IP地址的InetSocketAddress?

13

我想创建一个InetSocketAddress对象,但无论我得到的是host:port还是ip:port,我都想做正确处理。我发现它有两个构造函数,一个用于host(String类型),另一个用于IP(InetAddress类型)。我是否需要自己确定我得到的是IP还是HOST来选择这两个构造函数之一?我是否遗漏了什么?


唯一需要记住的事情(如果这对你很重要),就是IP地址将会更快,因为它们不需要解析。 - MadProgrammer
4个回答

19

您可以从Javadoc中推断,并在源代码中查看,new InetSocketAddress(String hostname, int port)调用了InetAddress.getByName(hostname),它已经为您作出了详细记录的所有处理。

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


3

我不太确定你在问什么,但是我在我的电脑上进行了快速测试,没有任何问题。

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地址、主机名还是其他形式?请注意保留HTML标记。

没关系。看我的回答。 - user207421

0

您需要确定传递给构造函数的字符串是IP地址还是主机名。我会使用正则表达式来判断是否为IP地址。如果失败了,那么它很可能是主机名。

IP地址和主机名都是字符串,因此您只需要一个构造函数。


你可以让类抛出一个UnknwnHostException并以这种方式处理它,从而消除一些复杂性,但仍然需要满足要求。不过是个好建议 ;) - MadProgrammer
你为什么要这样做? - user207421

0
值得一提的是,如果您不知道您的DNS名称或IP地址,您可以仅使用端口构造函数。
new InetSocketAddress(8080)

它在内部调用InetAddress.anyLocalAddress()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接