Problema
sistema My Windows tiene varios adaptadores de Ethernet. Dado el nombre de un adaptador de Ethernet, necesito encontrar sus direcciones IP.Obtener direcciones IPv4 de un adaptador Ethernet en Windows usando Java 1.5
Por ejemplo, la salida del comando ipconfig
de mi sistema es:
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
Nota: No necesita preocuparse acerca de los adaptadores inalámbricos o cualquier otro tipo de adaptadores. Necesito hacer esto solo para adaptadores ethernet.
Para este sistema, tengo que escribir una clase Java que se comporta como se muestra a continuación:
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
lo que no funciona
Usando java.net.NetworkInterface no ayuda. Es getName() y getDisplayName() métodos no se imprimen los nombres de conexión del adaptador tal como aparece en la salida del ipconfig
o en conexiones de red de Windows. Imprimen los nombres de los dispositivos reales en su lugar. Por ejemplo, considere el siguiente código:
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();
}
}
}
Esto imprime el siguiente resultado:
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
Un truco feo que funciona
He escrito un truco feo que extrae las direcciones IP de la nombre de adaptador especificado de la salida ipconfig
. Aquí está el código.
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);
}
}
}
Pregunta
¿Hay una mejor manera de resolver este problema?
Parece que Java está diseñado a ser compatible Unix, Windows NIC los nombres no se han definido bien y varían según la plataforma. –