源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

如何利用NetworkInterface获取服务器MAC地址

  • 时间:2022-03-28 03:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:如何利用NetworkInterface获取服务器MAC地址
在很多时候,我们需要获得服务器硬件信息(比如MAC地址),常用的有几种的方式: •使用命令行程序获得硬盘信息,然后通过Runtime.getRuntime().exec获得输出流,然后通过字符串分析获得MAC地址 •编译本地程序,然后通过JNI调用 以上两种方式都需要区分不同的操作系统平台,分别编码,比较麻烦,比如 • windows平台需要使用iptables /all命令 •linux平台需要使用ifconfig命令 今天介绍一种通用的跨平台的操作方式,那就是JDK自带的NetworkInterface接口,该接口在JDK1.4已经出现,但是功能比较少,JDK1.6之后新增了不少新功能,比较不错。 具体功能大家可以参考API文档,这里主要介绍一下如何获得服务器MAC地址,代码如下,有注释,不多讲。
[u]复制代码[/u] 代码如下:
//获取所有网卡的MAC地址        public static List<String> getAllMac() {                 List<String> list = new ArrayList<String>();                 try {                         Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();// 返回所有网络接口的一个枚举实例                         while (e.hasMoreElements()) {                                 NetworkInterface network = e.nextElement();// 获得当前网络接口                                 if (network != null) {                                         if (network.getHardwareAddress() != null) {                                                 // 获得MAC地址                                                 //结果是一个byte数组,每项是一个byte,我们需要通过parseByte方法转换成常见的十六进制表示                                                 byte[] addres = network.getHardwareAddress();                                                 StringBuffer sb = new StringBuffer();                                                 if (addres != null && addres.length > 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(addres[5]));                                                         list.add(sb.toString());                                                 }                                         }                                 } else {                                         System.out.println("获取MAC地址发生异常");                                 }                         }                 } catch (SocketException e) {                         e.printStackTrace();                 }                 return list;         }            //格式化二进制         private static String parseByte(byte b) {                 int intValue = 0;                 if (b >= 0) {                         intValue = b;                 } else {                         intValue = 256 + b;                 }                 return Integer.toHexString(intValue);         }
然后,我们用如下测试代码,看一下测试结果
[u]复制代码[/u] 代码如下:
                List<String> list = getAllMac();                 for (String mac : list) {                         System.out.println(mac);                 }
输出结果如下:
[u]复制代码[/u] 代码如下:
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方法,如下:
[u]复制代码[/u] 代码如下:
        private static String parseByte(byte b) {                  String s = "00"+Integer.toHexString(byte0);                  return s.substring(s.length() - 2);         }
输出结果就变了:
[u]复制代码[/u] 代码如下:
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()返回此接口的最大传输单元(Maximum Transmission Unit,MTU) •String getName()获取此网络接口的名称 •boolean isLoopback()返回此网络接口是否是回送接口 •boolean isPointToPoint()返回此网络接口是否是点对点接口 •boolean isUp()返回此网络接口是否已经开启并运行 •boolean isVirtual()返回此接口是否是虚拟接口
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部