Приложение Java, желающее использовать и Inet4Address, и Inet6Address одновременно

У меня есть приложение 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, если это имеет значение.

Спасибо!

6
задан His 6 October 2010 в 11:08
поделиться