問題
私のWindowsシステムには複数のイーサネットアダプタがあります。イーサネットアダプタの名前が与えられたら、私はそのIPアドレスを見つける必要があります。例えばJava 1.5を使用してWindowsでイーサネットアダプタのIPv4アドレスを取得
、私のシステムの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ネットワーク接続に表示されるアダプタ接続名は印刷されません。代わりに実際のデバイス名が表示されます。
を作品
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
醜いハック私はのIPアドレスを抽出し、醜いハックを書いた:
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();
}
}
}
これは、次の出力は、出力します。たとえば、次のコードを検討指定されたアダプタ名は出力のipconfig
から出力されます。ここにコードがあります。
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);
}
}
}
JavaはWindowsのNIC、Unixの互換性があるに設計されているように見えます名前は明確に定義されておらず、プラットフォームごとに異なります。 –