서버 하드웨어 정보(예: MAC 주소)를 얻어야 하는 경우가 많습니다. 일반적으로 사용되는 방법은 다음과 같습니다.
• 명령줄 프로그램을 사용하여 하드 디스크 정보를 얻은 다음 Runtime.getRuntime().exec를 통해 출력 스트림을 얻은 다음 문자열 분석을 통해 MAC 주소를 얻습니다.
•로컬 프로그램을 컴파일한 후 JNI를 통해 호출합니다.
위의 두 방법 모두 서로 다른 운영 체제 플랫폼을 구별하고 별도로 인코딩해야 하며 이는 다음과 같이 더 번거롭습니다.
• Windows 플랫폼은 iptables /all 명령을 사용해야 합니다.
•Linux 플랫폼에서는 ifconfig 명령을 사용해야 합니다.
오늘은 JDK와 함께 제공되는 NetworkInterface 인터페이스인 일반적인 크로스 플랫폼 작업 방법을 소개하겠습니다. 이 인터페이스는 JDK1.4에 등장했지만 JDK1.6 이후에는 비교적 적은 기능이 추가되었습니다. 꽤 좋습니다.
구체적인 기능은 API 문서를 참조하시면 됩니다. 여기서는 주로 서버 MAC 주소를 얻는 방법을 소개합니다. 코드는 다음과 같으므로 자세한 내용은 다루지 않겠습니다.
다음과 같이 코드 코드를 복사합니다 .
//모든 네트워크 카드의 MAC 주소를 가져옵니다.
공개 정적 List<String> getAllMac() {
List<String> 목록 = new ArrayList<String>();
노력하다 {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); // 모든 네트워크 인터페이스의 열거 인스턴스를 반환합니다.
동안(e.hasMoreElements()) {
NetworkInterface network = e.nextElement();//현재 네트워크 인터페이스 가져오기
if (네트워크 != null) {
if (network.getHardwareAddress() != null) {
// MAC 주소 얻기
//결과는 바이트 배열이고, 각 항목은 바이트이므로, 이를 parsByte 메소드를 통해 일반적인 16진수 표현으로 변환해야 합니다.
byte[] 주소 = network.getHardwareAddress();
StringBuffer sb = new StringBuffer();
if (주소 != null && addres.length > 1) {
sb.append(parseByte(주소[0])).append(":").append(
parseByte(주소[1])).append(":").append(
parseByte(주소[2])).append(":").append(
parseByte(주소[3])).append(":").append(
parseByte(주소[4])).append(":").append(
parsByte(주소[5]));
list.add(sb.toString());
}
}
} 또 다른 {
System.out.println("MAC 주소를 얻는 동안 예외가 발생했습니다.");
}
}
} 잡기(SocketException e) {
e.printStackTrace();
}
반환 목록;
}
//바이너리 포맷
개인 정적 문자열 파싱바이트(바이트 b) {
int intValue = 0;
만약 (b >= 0) {
int값 = b;
} 또 다른 {
intValue = 256 + b;
}
return Integer.toHexString(intValue);
}
그런 다음 다음 테스트 코드를 사용하여 테스트 결과를 확인합니다.
다음과 같이 코드 코드를 복사합니다 .
List<String> 목록 = 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이 하나만 있다는 것을 알았습니다. 이는 매우 어색해 보입니다. 다음과 같이 parseByte 메서드를 수정하는 것이 좋습니다.
다음과 같이 코드 코드를 복사합니다 .
개인 정적 문자열 파싱바이트(바이트 b) {
문자열 s = "00"+Integer.toHexString(byte0);
return 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()은 이 인터페이스가 가상 인터페이스인지 여부를 반환합니다.