Java 用IP地址构造任何主机的InetSocketAddress的正确方法是什么?

Java 用IP地址构造任何主机的InetSocketAddress的正确方法是什么?,java,sockets,networking,tcp,network-programming,Java,Sockets,Networking,Tcp,Network Programming,我想创建一个InetSocketAddress,但无论我得到的是host:port还是ip:port,我都想正确地创建它。我看到它有两个构造函数,一个用于主机(字符串),另一个用于IP(InetAddress)。为了在这两个构造器之间进行选择,我必须自己确定我是否拥有IP或主机吗?我是不是遗漏了什么?我不完全确定你的问题是什么,但是,我在我的电脑上做了这个快速测试,没有任何问题 try { String ipAddress = ""; // Add your own Strin

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

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

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地址、主机名或其他形式???

您必须确定传递给构造函数的字符串是IP还是主机名。我会用一个Regex作为IP地址。如果失败,可能是主机名


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

您可以从Javadoc中推断,并在源代码中看到,
新的InetSocketAddress(字符串主机名,int-port)
调用
InetAddress.getByName(主机名)
,它会根据文档为您整理所有这些内容


因此,你所发布的问题实际上并不存在。只要传递你得到的任何字符串,不管是主机名还是IP地址。

同样值得一提的是,如果你不知道你的dns名称或IP,你可以简单地使用只带端口的构造函数

new InetSocketAddress(8080)

它在内部调用
InetAddress.anyLocalAddress()

,您可以让类抛出一个未知的hostException并以这种方式进行处理,消除了一些复杂性,但仍然会满足需求。不过建议不错;)你必须这么做为什么?没关系。请看我的答案。你应该记住的唯一一件事(如果它对你很重要的话),IP地址会很快得到解决,因为它们不需要解析。