问题
我的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()和getDisplayName()方法不会打印出现在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);
- }
- }
- }
题