Как поддерживать IPv4 и IPv6 на Java

Одна из наших программ Java при запуске, она прослушивает только IPv6 (8080)

например.

# netstat -ntpl

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp6       0      0 :::8080                 :::*                    LISTEN      -               
tcp6       0      0 :::22                   :::*                    LISTEN      -               

Проблема заключается в том, что он недоступен извне (кроме localhost), чтобы решить эту проблему, у меня есть это вручную добавить

-Djava.net.preferIPv4Stack=true

Но это делает программу только для сети IPv4.

Можно ли сделать что-то вроде sshd, как указано выше, поддерживают IPv4 и IPv6?

Ответы

Ответ 1

Я подозреваю, что это меньше проблем с программированием на Java, чем проблема конфигурации сетевой сети/сети OS:

http://coding.derkeiler.com/Archive/Java/comp.lang.java.help/2009-09/msg00087.html

В некоторых операционных системах один собственный сокет TCP может прослушивать порт на обоих     IPv4 и IPv6 одновременно. Он может принимать соединения из     удаленный IPv4 и от удаленных клиентов IPv6. В других ОС (например, WinXP)     родной софт OS НЕ МОЖЕТ сделать это, но может принимать только от IPv4 или     IPv6, не оба. На этих ОС необходимо иметь двух слушателей     сокетов, чтобы иметь возможность принимать соединения с удаленного IPv4     и клиенты IPv6, один сокет для прослушивания IPv4-подключений и один для     IPv6.

Windows 7 и Windows Server 2008 обрабатывают двойные стеки просто отлично; Windows XP не так много:)

Вы, похоже, работаете в Linux - большинство современных Linux-настольных компьютеров и серверов также без проблем обрабатывают двойной ipv4 ipv6.

Вот хорошая статья об интероперабельности:

Вы знаете, как вы можете "отключить" IPV6 для вашего приложения Java: -Djava.net.preferIPv4Stack=true

Вы также можете заставить свой сервер использовать IPV6 следующим образом: echo 0 > /proc/sys/net/ipv6/bindv6only

Это, возможно, ваш лучший источник:

Вы абсолютно не сможете выполнить то, что хотите (по крайней мере, на уровне программирования Java), если только вы не ограничены внешними проблемами сети:

Nodes)      V4 Only  V4/V6  V6 Only
            -------  -----  -------
V4 Only     x        x   
V4/V6       x        x      x
V6 Only              x      x

PS:

Вот еще одна хорошая ссылка, которая объясняет, что происходит на уровне сокета. Это не Java (это C), но применимы только примеры принципов: