多くの場合、サーバーのハードウェア情報 (MAC アドレスなど) を取得する必要があります。一般的に使用される方法がいくつかあります。
•コマンドラインプログラムを使用してハードディスク情報を取得し、Runtime.getRuntime().exec を通じて出力ストリームを取得し、文字列解析を通じて MAC アドレスを取得します。
•ローカルプログラムをコンパイルし、JNI経由で呼び出します。
上記のどちらの方法でも、異なるオペレーティング システム プラットフォームを区別し、それらを個別にエンコードする必要がありますが、これはさらに面倒です。
• Windows プラットフォームでは iptables /all コマンドを使用する必要があります。
•Linux プラットフォームでは ifconfig コマンドを使用する必要があります。
今回は、一般的なクロスプラットフォームの操作方法として、JDK に付属する NetworkInterface インターフェースを紹介します。このインターフェースは、JDK1.4 から登場しましたが、JDK1.6 以降、多くの新機能が追加されました。かなり良いです。
特定の機能については API ドキュメントを参照してください。ここでは、主にサーバーの MAC アドレスを取得する方法を説明します。コードは次のとおりです。詳細については説明しません。
次のようにコードをコピーします。
//すべてのネットワークカードのMACアドレスを取得します
public static List<String> getAllMac() {
List<String> list = new ArrayList<String>();
試す {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces() // すべてのネットワーク インターフェイスの列挙インスタンスを返します。
while (e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//現在のネットワークインターフェースを取得します
if (ネットワーク != null) {
if (network.getHardwareAddress() != null) {
// MACアドレスを取得する
//結果はバイト配列で、各項目はバイトです。parseByte メソッドを通じて一般的な 16 進表現に変換する必要があります。
byte[] アドレス = network.getHardwareAddress();
StringBuffer sb = new StringBuffer();
if (アドレス != null && アドレスの長さ > 1) {
sb.append(parseByte(addres[0])).append(":").append(
parseByte(addres[1])).append(":").append(
parseByte(addres[2])).append(":").append(
parseByte(addres[3])).append(":").append(
parseByte(addres[4])).append(":").append(
parseByte(アドレス[5]));
list.add(sb.toString());
}
}
} それ以外 {
System.out.println("MAC アドレスの取得中に例外が発生しました");
}
}
} catch (SocketException e) {
e.printStackTrace();
}
リストを返す;
}
//バイナリをフォーマットする
プライベート静的文字列 parseByte(byte b) {
int intValue = 0;
if (b >= 0) {
intValue = b;
} それ以外 {
intValue = 256 + b;
}
Integer.toHexString(intValue) を返します。
}
次に、次のテストコードを使用してテスト結果を確認します。
次のようにコードをコピーします。
List<String> list = getAllMac();
for (文字列 mac : リスト) {
System.out.println(mac);
}
出力は次のとおりです。
次のようにコードをコピーします。
0:18:8b:cc:xx:e3
0:0:0:0:0:0:0:e0
0:50:xx:c0:0:1
0:50:xx:c0:0:8
「0:18:8b:cc:xx:e3」には 0 が 1 つしかないことに誰もが気づきましたが、これは非常に不自然に見えます。次のように parseByte メソッドを修正したほうがよいでしょう。
次のようにコードをコピーします。
private static String parseByte(byte b) {
文字列 s = "00"+Integer.toHexString(byte0);
s.substring(s.length() - 2) を返します。
}
出力結果は次のように変わります。
次のようにコードをコピーします。
00:18:8b:cc:xx:e3
00:00:00:00:00:e0
00:50:xx:c0:00:01
00:50:xx:c0:00:08
こっちのほうが楽そうですよね?
さらに、NetworkInterface インターフェイスには次のメソッドも提供されており、参照できます。
•String displayName() ネットワークインターフェースの表示名を取得します。
•int getMTU() は、このインターフェイスの最大伝送単位 (MTU) を返します。
•String getName() は、このネットワーク インターフェイスの名前を取得します。
•boolean isLoopback() は、このネットワーク インターフェイスがループバック インターフェイスであるかどうかを返します。
•boolean isPointToPoint() は、このネットワーク インターフェイスがポイントツーポイント インターフェイスであるかどうかを返します。
•boolean isUp() は、このネットワークインターフェイスが稼働しているかどうかを返します。
•boolean isVirtual() は、このインターフェイスが仮想インターフェイスかどうかを返します。