起初:没有一个地址。您的机器至少有两个地址(“lo”上为127.0.0.1,“eth1”上为192.168.1.1)。
你想这样的:Listing network interfaces
正如你所期待,你不能自动检测出连接到任何你的路由器的,因为这需要你的路由表的潜在复杂的分析。但如果你只是想要任何非本地地址,这应该足够了。可以肯定的是,至少在Vista或Windows 7上至少使用一次,因为它们会添加IPv6地址。
import java.io.*;
import java.net.*;
import java.util.*;
import static java.lang.System.out;
public class ListNets
{
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: bge0
Name: bge0
InetAddress: /fe80:0:0:0:203:baff:fef2:e99d%2
InetAddress: /121.153.225.59
Display name: lo0
Name: lo0
InetAddress: /0:0:0:0:0:0:0:1%1
InetAddress: /127.0.0.1
+1 for'if(cur.isLoopback())' – aioobe 2010-05-16 20:20:21
如果你有很多接口呢?例如,一个用于电缆,一个用于wifi,一个用于虚拟盒子等等。是不可能实际看到哪一个连接到网络? – cragiz 2010-05-16 21:05:23
@亨利克。在这种情况下,所有这些都是“连接”的。由您的操作系统决定哪一个将用于外部路由。你可以使用这个Socket构造函数http://java.sun.com/j2se/1.5.0/docs/api/java/net/Socket.html#Socket(java.net.InetAddress,%20int,%20java.net。 InetAddress,%20int)来选择特定的本地地址和端口,或者构建默认套接字并将其绑定到特定接口。另外,请检查您是否可以从NetworkInterface对象确定需要的信息。 – 2010-05-17 11:56:03