由NodeJS启动的Java进程似乎无法检测到网络接口的IPv6地址。考虑一下下面的java代码:
public class ListAddresses {
public static void main(String args[]) throws SocketException {
Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netint : Collections.list(nets))
displayInterfaceInformation(netint);
}
static void displayInterfaceInformation(NetworkInterface netint)
throws SocketException {
out.printf("Display name: %s\n", netint.getDisplayName());
out.printf("Name: %s\n", netint.getName());
Enumeration<InetAddress> inetAddresses = netint.getInetAddresses();
for (InetAddress inetAddress : Collections.list(inetAddresses)) {
out.printf("InetAddress: %s\n", inetAddress);
}
out.printf("\n");
}
}
如果我从命令行运行它,它会输出以下内容:
Display name: wlan0
Name: wlan0
InetAddress: /fe80:0:0:0:6e88:14ff:fe67:8130%3
InetAddress: /192.168.1.102
Display name: lo
Name: lo
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1
如果我从NodeJS内部启动它,如下所示:
var spawn = require('child_process').spawn;
var prc = spawn('java', ['ListAddresses']);
prc.stdout.on('data', function (data) {
console.log('' + data);
});
那么它的输出是:
Display name:
wlan0
Name: wlan0
InetAddress: /192.168.1.102
Display name: lo
Name: lo
InetAddress: /127.0.0.1
因此,缺少IPv6地址。最后,如果我将产卵的方式改为这样:
var prc = spawn('java', ['ListAddresses'], { stdio: [ 'ignore', null, null] });
然后,启动的java进程会正确打印出所有的IP地址(这似乎与https://stackoverflow.com/a/22950304/594406有某种关系,但我看不出是怎么回事)。有人知道这是怎么回事吗?我在Ubuntu 14.04.3 LTS
上使用java 1.8.0_66
和node v4.2.2
。请注意,父NodeJS进程会检测IPv6地址,如果我启动了一个NodeJS子进程,那么它也会检测到它们。
https://stackoverflow.com/questions/34108124
复制相似问题