若是系统中开启了IPV6协议(好比window7),java网络编程常常会获取到IPv6的地址,这明显不是咱们想要的结果,搜索发现不少蹩脚的作法是:禁止IPv6协议。其实查看官方文档有详细的说明:java
java.net.preferIPv4Stack (default: false)编程
If IPv6 is available on the operating system the underlying native socket
will be an IPv6 socket. This allows Java(tm) applications to connect too, and
accept connections from, both IPv4 and IPv6 hosts.网络If an application has a preference to only use IPv4 sockets then this
property can be set to true. The implication is that the application will not be
able to communicate with IPv6 hosts.app
在实际的运用中有如下几种办法能够实现指定获取IPv4的地址:socket
java -Djava.net.preferIPv4Stack=true -cp .;classes/ michael.net.TestInetAddress java -Djava.net.preferIPv6Addresses=true -cp .;classes/ michael.net.TestInetAddress
import java.net.InetAddress; public class TestInetAddress { public static void main(String[] args) throws Exception { // 注释指定系统属性值 // System.setProperty("java.net.preferIPv4Stack", "true"); // System.setProperty("java.net.preferIPv6Addresses", "true"); System.out.println("-------InetAddress.getLocalHost()"); InetAddress addr = InetAddress.getLocalHost(); System.out.println("HostName := " + addr.getHostName()); System.out.println("HostAddress := " + addr.getHostAddress()); System.out.println("-------InetAddress.getByName(\"micmiu.com\")"); InetAddress addr2 = InetAddress.getByName("micmiu.com"); System.out.println("HostName := " + addr2.getHostName()); System.out.println("HostAddress := " + addr2.getHostAddress()); } }
java.net.preferIPv4Stack=true 运行结果以下:this
——-InetAddress.getLocalHost() HostName := Michael-PC HostAddress := 10.7.246.163 ——-InetAddress.getByName(“micmiu.com”) HostName := micmiu.com HostAddress := 173.254.28.17
java.net.preferIPv6Addresses=true 运行结果以下:spa
——-InetAddress.getLocalHost() HostName := Michael-PC HostAddress := fe80:0:0:0:6518:85da:8690:16eb%13 ——-InetAddress.getByName(“micmiu.com”) HostName := micmiu.com HostAddress := 173.254.28.17
可在 catalina.bat 或者 catalina.sh 中增长以下环境变量便可:.net
SET CATALINA_OPTS=-Djava.net.preferIPv4Stack=true