One of our Java program when started, it only listen on IPv6 (8080)
e.g.
# 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 -
The problem is it is not accessible from outside (except localhost), to solve this, I have this manually add
-Djava.net.preferIPv4Stack=true
But this make the program is only for IPv4 network.
Is it possible to do something like the sshd as above, both support IPv4 and IPv6?
I suspect it’s less a Java programming issue than an OS networking stack/OS network configuration issue:
Windows 7 and Windows Server 2008 handle dual stacks just fine; Windows XP not so much 🙂
You seem to be on Linux – most modern Linux desktops and servers also handle dual ipv4 ipv6 with no problem.
Here’s a good article on interoperability:
You know how you can “turn off” IPV6 for your Java application:
-Djava.net.preferIPv4Stack=trueYou can also force your server to use IPV6 like this:
echo 0 > /proc/sys/net/ipv6/bindv6onlyThis is arguably your best source:
You should absolutely be able to accomplish what you want (at least at the Java programming level), unless you’re limited by external network issues:
PS:
Here’s one more good link, which explains what’s happening at the socket level. It’s not Java (it’s C), but exactly the sample principles apply: