使用Java在UNIX上获取计算机IP的安全方法
我需要使用Java从Ubuntu获取计算机IP。我尝试了使用Java在UNIX上获取计算机IP的安全方法,java,unix,inetaddress,Java,Unix,Inetaddress,我需要使用Java从Ubuntu获取计算机IP。我尝试了InetAddress.getLocalHost.getHostAddress().toString()但它返回127.0.0.1。我正在搜索解决方案,发现以下代码: NetworkInterface ni = NetworkInterface.getByName("eth0"); Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
InetAddress.getLocalHost.getHostAddress().toString()
但它返回127.0.0.1
。我正在搜索解决方案,发现以下代码:
NetworkInterface ni = NetworkInterface.getByName("eth0");
Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
while(inetAddresses.hasMoreElements()) {
InetAddress ia = inetAddresses.nextElement();
if(!ia.isLinkLocalAddress()) {
System.out.println("IP: " + ia.getHostAddress());
}
}
}
NetworkInterface ni=NetworkInterface.getByName(“eth0”);
枚举inetAddresses=ni.getInetAddresses();
while(inetAddresses.hasMoreElements()){
InetAddress ia=inetAddresses.nextElement();
如果(!ia.isLinkLocalAddress()){
System.out.println(“IP:+ia.getHostAddress());
}
}
}
这段代码对我有用,但问题是当计算机使用“eth1”接口或计算机可以使用无线适配器连接到网络(wlan0)时。在这种情况下,程序将失败。你们能告诉我从UNIX系统获取IP的安全方法吗?问候。查看此问题的答案:
我没有测试它,但它似乎适用。使用枚举
getNetworkInterfaces()编码>并循环浏览它们
Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
while (eni.hasMoreElements()) {
NetworkInterface ni = eni.nextElement();
Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();
while(inetAddresses.hasMoreElements()) {
InetAddress ia = inetAddresses.nextElement();
if(!ia.isLinkLocalAddress()) {
System.out.println("Interface: " + ni.getName() + " IP: " + ia.getHostAddress());
}
}
}
我的机器仅通过192.168.0.8上的无线接口连接虽然一台计算机可以有多个网络接口和不同的IP,但某些接口也可以是环回或不运行的。为了“安全”,您甚至可能需要检查接口的名称,以查看是否使用了所需的IP地址
以下方法将为您提供来自非环回、启动和运行接口的ip地址列表
public static List<InetAddress> getIPAddress() throws SocketException {
List<InetAddress> ipAddresses = new ArrayList<InetAddress>();
Enumeration e;
e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) e.nextElement();
if (ni.isLoopback() || !ni.isUp()) continue;
for (Enumeration e2 = ni.getInetAddresses(); e2.hasMoreElements(); ) {
InetAddress ip = (InetAddress) e2.nextElement();
ipAddresses.add(ip);
}
}
return ipAddresses;
}
publicstaticlist getIPAddress()抛出SocketException{
List ipaddress=new ArrayList();
e;
e=网络接口。getNetworkInterfaces();
而(e.hasMoreElements()){
NetworkInterface ni=(NetworkInterface)e.nextElement();
如果(ni.isLoopback()| |!ni.isUp())继续;
对于(枚举e2=ni.getInetAddresses();e2.hasMoreElements();){
InetAddress ip=(InetAddress)e2.nextElement();
ip地址。添加(ip);
}
}
返回IP地址;
}
所谓“安全”是指“可靠”而不是“危险”的对立面,对吗?是的。我指的是在所有UNIX系统上都有效的方法。如果计算机对Windows InetAddress使用除“eth0”以外的其他接口,则我的方法是危险的。getLocalHost.getHostAddress().toString()正在工作。如果计算机在家庭无线防火墙/路由器后面使用,该怎么办?这些路由器通常会将192.168.1.x之类的地址分配给家庭中的计算机,并多路传输分配给家庭的实际互联网地址。如果防火墙允许并路由传入,则计算机的地址(192.168.1.101)可能不是可以在internet(32.78.23.4)上与计算机联系的地址。除了计算机可以使用多个网络接口,每个网络接口可以分配多个ip地址之外,还有一个问题,如果您想要本地地址(例如,决定服务器进程应该绑定到哪个地址)或公共internet地址(以便知道对等方应该连接到哪个地址)。某些计算机不会知道其外部IP-尝试向远程服务器发送请求
public static List<InetAddress> getIPAddress() throws SocketException {
List<InetAddress> ipAddresses = new ArrayList<InetAddress>();
Enumeration e;
e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) e.nextElement();
if (ni.isLoopback() || !ni.isUp()) continue;
for (Enumeration e2 = ni.getInetAddresses(); e2.hasMoreElements(); ) {
InetAddress ip = (InetAddress) e2.nextElement();
ipAddresses.add(ip);
}
}
return ipAddresses;
}