问题
我的Windows系统有多个以太网适配器.鉴于以太网适配器的名称,我需要找到它的IP地址.
例如,我系统的ipconfig命令的输出是:
Ethernet adapter GB1: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 0.0.0.0 Subnet Mask . . . . . . . . . . . : 0.0.0.0 Default Gateway . . . . . . . . . : Ethernet adapter SWITCH: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 10.200.1.11 Subnet Mask . . . . . . . . . . . : 255.255.255.0 IP Address. . . . . . . . . . . . : 10.200.1.51 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : Ethernet adapter LAN: Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 10.1.2.62 Subnet Mask . . . . . . . . . . . : 255.255.254.0 IP Address. . . . . . . . . . . . : 10.1.2.151 Subnet Mask . . . . . . . . . . . : 255.255.254.0 Default Gateway . . . . . . . . . : 10.1.2.1
注意:我不必担心无线适配器或任何其他类型的适配器.我只需要为以太网适配器执行此操作.
对于这个系统,我需要编写一个行为如下所示的Java类:
C:>java NameToIp GB1 0.0.0.0 C:>java NameToIp SWITCH 10.200.1.11 10.200.1.51 C:>java NameToIp LAN 10.1.2.62 10.1.2.151
什么行不通
使用java.net.NetworkInterface没有帮助.它的getName()和@L_502_3@方法不会打印出现在ipconfig输出或Windows网络连接中的适配器连接名称.它们会打印实际的设备名称.例如,请考虑以下代码:
import java.util.Enumeration; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; public class ListInterfaces { public static void main(String[] args) throws SocketException,UnknownHostException { Enumeration<NetworkInterface> nwInterfaces = NetworkInterface.getNetworkInterfaces(); while (nwInterfaces.hasMoreElements()) { NetworkInterface nwInterface = nwInterfaces.nextElement(); System.out.print(nwInterface.getName() + ": " + nwInterface.getDisplayName()); Enumeration<InetAddress> addresses = nwInterface.getInetAddresses(); while (addresses.hasMoreElements()) { InetAddress address = addresses.nextElement(); System.out.print(" - " + address.getHostAddress()); } System.out.println(); } } }
这将打印以下输出:
C:>java ListInterfaces lo: MS TCP Loopback interface - 127.0.0.1 eth0: Broadcom BCM5709C NetXtreme II GigE (NDIS VBD Client) # eth1: Broadcom BCM5709C NetXtreme II GigE (NDIS VBD Client) #2 - 10.200.1.11 - 10.200.1.51 eth2: Broadcom BCM5709C NetXtreme II GigE (NDIS VBD Client) #3 - 10.1.2.62 - 10.1.2.151
一个丑陋的黑客行事
我编写了一个丑陋的黑客,它从ipconfig的输出中提取指定适配器名称的IP地址.这是代码.
import java.util.ArrayList; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.InputStream; import java.io.IOException; public class NameToIp { public static ArrayList<String> getIP(String adapterName) throws IOException,InterruptedException { // Run the Windows 'ipconfig' command and get its stdout ProcessBuilder cmdBuilder = new ProcessBuilder("ipconfig"); Process process = cmdBuilder.start(); BufferedReader stdout = new BufferedReader( new InputStreamReader(process.getInputStream())); // Find the section for the specified adapter String line; boolean foundAdapter = false; while ((line = stdout.readLine()) != null) { line = line.trim(); if (line.equals("Ethernet adapter " + adapterName + ':')) { foundAdapter = true; break; } } if (!foundAdapter) { process.waitFor(); throw new IOException("Adapter not found"); } // Find IP addresses in the found section ArrayList<String> ips = new ArrayList<String>(); while ((line = stdout.readLine()) != null) { // Stop parsing if we reach the beginning of the next // adapter section in the output of ifconfig if (line.length() > 0 && line.charAt(0) != ' ') { break; } line = line.trim(); // Extract IP addresses if (line.startsWith("IP Address.") || line.startsWith("IPv4 Address.")) { int colonIndex; if ((colonIndex = line.indexOf(':')) != 1) { ips.add(line.substring(colonIndex + 2)); } } } process.waitFor(); return ips; } public static void main(String[] args) throws IOException,InterruptedException { // Print help message if adapter name has not been specified if (args.length != 1) { StackTraceElement[] stack = Thread.currentThread().getStackTrace(); String prog = stack[stack.length - 1].getClassName(); System.err.println("Usage: java " + prog + " ADAPTERNAME"); System.err.println("Examples:"); System.err.println(" java " + prog +" \"Local Area Connection\""); System.err.println(" java " + prog +" LAN"); System.err.println(" java " + prog +" SWITCH"); System.exit(1); } ArrayList<String> ips = getIP(args[0]); for (String ip: ips) { System.out.println(ip); } } }
题