gpt4 book ai didi

希望同时使用 Inet4Address 和 Inet6Address 的 Java 应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:23 24 4
gpt4 key购买 nike

我有一个 Java 应用程序需要通过套接字连接到两台不同机器上的两个不同服务器。一台服务器已配置为监听 IPv4 连接,而另一台已配置为监听 IPv6 连接。

现在,假设“host1”是监听 IPv4 连接的服务器的机器名,而“host2”是监听 IPv6 连接的服务器的机器名。我需要获取“host1”的 Inet4Address 和“host2”的 Inet6Address 以创建到每个服务器的套接字连接,如下所示:

Inet4Address inet4 = (Inet4Address)InetAddress.getByName("host1");
InetSocketAddress soc4 = new InetSocketAddress(inet4, 7777);
...

Inet6Address inet6 = (Inet6Address)InetAddress.getByName("host2");
InetSocketAddress soc6 = new InetSocketAddress(inet6, 7777);
...

但是,出于向后兼容的原因,默认情况下 JVM 更喜欢使用 IPv4 地址而不是 IPv6 地址。因此,在上面的代码中,第一次尝试连接“host1”成功,但第二次尝试连接“host2”失败,因为 InetAddress.getByName("host2") 返回一个 Inet4Address 而不是 Inet6Address

我知道我可以将系统属性 java.net.preferIPv6Addresses 设置为 true 以优先使用 IPv6 地址而不是 IPv4,但这反过来会导致第二次尝试连接到“host2”成功,但是第一次尝试连接“host1”失败(!),因为 InetAddress.getByName("host1") 返回 Inet6Address 而不是 Inet4Address

系统属性 java.net.preferIPv6Addresses 只被读取一次(参见 InetAddress 第 212-218 行),因此即使我在设置后将其值改回 false 也没有任何效果为真。

那么在这种情况下我能做什么呢?这似乎是一个常见问题,因此肯定已经有办法解决这个问题。

请注意,我当然可以使用 InetAddress.getByAddress() 并显式提供每台机器的 IP 地址,而不是取回 Inet4AddressInet6Address,但我不想这样做,除非我真的必须这样做。所以请其他解决方案。

哦,我正在使用 java 1.6.0_19 以防万一。

谢谢!

最佳答案

static Inet6Address getInet6AddressByName(String host) throws UnknownHostException, SecurityException
{
for(InetAddress addr : InetAddress.getAllByName(host))
{
if(addr instanceof Inet6Address)
return (Inet6Address)addr;
}
throw new UnknownHostException("No IPv6 address found for " + host);
}

关于希望同时使用 Inet4Address 和 Inet6Address 的 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3853286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com