У меня есть приложение Java, которому нужно подключаться через сокеты к двум разным серверам на двух разных машинах. Один сервер настроен для прослушивания подключений IPv4, а другой - для прослушивания подключений IPv6.
Теперь, предполагая "host1" - это машинное имя сервера, прослушивающего соединения IPv4, а «host2» - это машинное имя сервера, прослушивающего соединения IPv6. Мне нужно получить Inet4Address
для «host1» и Inet6Address
для «host2», чтобы создать сокетное соединение с каждым сервером, например следующее:
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. Предпочитаете IPv6Addresses
на true, чтобы предпочитать IPv6-адреса IPv4, но это, в свою очередь, приводит к успешной второй попытке подключения к «host2», но первая попытка подключения к «host1» не удалась (!), потому что InetAddress.getByName ("host1")
возвращает Inet6Address
вместо Inet4Address
.
Системное свойство java.net.preferIPv6Addresses
читается только один раз ( см. строку InetAddress 212-218), и поэтому он не будет иметь никакого эффекта, даже если я изменю его значение обратно на false после установки его в true.
Итак, что я могу сделать в этом случае? Это похоже на обычную проблему, так что наверняка уже должен быть способ ее решить.
Обратите внимание, что я, конечно, могу использовать InetAddress.getByAddress ()
и снабжать каждую машину ' s IP-адрес явно вместо того, чтобы получить обратно Inet4Address
и Inet6Address
, но я не хочу делать это, если мне действительно не нужно. Так что другие решения, пожалуйста.
О, я использую java 1.6.0_19, если это имеет значение.
Спасибо!