我有一个创建 ServerSocket 并绑定到的服务localhost:7060
。当我在 Android 设备上执行“netstat -an”时,我看到它使用 ipV6 localhost 而不是 ipv4 localhost 接口。
输出是这样的:
tcp6 0 0 ::ffff:127.0.0.1:7060 :::* 听
使用 ipV4 的端口如下所示:
tcp 0 0 127.0.0.1:5060 0.0.0.0:* 监听
强制它始终使用 IPv4 的技巧是什么?
我正在使用 iptables 设置端口转发规则。我的版本支持 ipv4 目标地址。
这就是我创建用于侦听端口的 Java 代码的方式。
InetAddress localAddress = Inet4Address.getByName("localhost");
//InetAddress localAddress = Inet4Address.getLocalHost();
sockServer = new ServerSocket(nPort, 20, localAddress);
我遵循了其他建议,例如在服务启动时将系统属性设置为首选 ipV4。那没有什么区别。
System.setProperty("java.net.preferIPv4Stack", "true");
我在为嵌入式设备构建的 Android 2.3 上运行它。
更新:
我检查了 android 树中的 InetAddress.java 源。它正在用如下所示的行读取上面的标志。
static boolean preferIPv6Addresses() {
String propertyName = "java.net.preferIPv6Addresses";
String propertyValue = AccessController.doPrivileged(new PriviAction<String>(propertyName));
return Boolean.parseBoolean(propertyValue);
}
现在我不确定 System.setProperty() 调用是否真的改变了上面代码读取的值。