13

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

4

4 回答 4

18

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

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

于 2012-08-18T01:01:51.300 回答
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地址、主机名或其他形式??

于 2012-08-17T23:17:08.317 回答
0

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

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

于 2012-08-17T23:26:07.863 回答
0

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

new InetSocketAddress(8080)

它在内部调用InetAddress.anyLocalAddress()

于 2020-09-10T15:51:08.303 回答