【问题标题】:How do I get the hosts mac address using Java 5?如何使用 Java 5 获取主机 mac 地址?
【发布时间】:2009-08-26 09:05:12
【问题描述】:

我知道您可以使用java.net.NetworkInterface->getHardwareAddress() 在 Java 6 上做到这一点。但我部署的环境仅限于 Java 5。

有人知道如何在 Java 5 或更早版本中执行此操作吗?非常感谢。

【问题讨论】:

  • 不是答案(因此发表评论),但如果没有内置方法,您总是可以从 Java 6 中获取代码并将其反向移植。来源可用。
  • 这是 Java 6 中的本机调用,因此反向移植不起作用。在没有连接上下文的情况下获取 Mac 地址可能毫无意义。在某些情况下,您可能会获得虚拟设备使用的虚假 Mac 地址。这些地址不是全球唯一的。众所周知,一些 VPN 驱动程序、AOL 客户端可以在 Windows 上使用固定 Mac 安装此类设备。他们很少弹出到第一台设备,但我们以前也遇到过。
  • 主机有8个MAC地址你要哪个?
  • 不确定。哪个最好?

标签: java java-5


【解决方案1】:

Java 5 中的标准方法是启动本机进程以运行 ipconfigifconfig 并解析 OutputStream 以获得答案。

例如:

private String getMacAddress() throws IOException {
    String command = “ipconfig /all”;
    Process pid = Runtime.getRuntime().exec(command);
    BufferedReader in = new BufferedReader(new InputStreamReader(pid.getInputStream()));
    Pattern p = Pattern.compile(”.*Physical Address.*: (.*)”);
    while (true) {
        String line = in.readLine();
        if (line == null)
            break;
        Matcher m = p.matcher(line);
        if (m.matches()) {
            return m.group(1);
        }
    }
}

【讨论】:

  • 这仅适用于 Windows。获取独立于操作系统的 MAC 地址是否有更好的解决方案?
  • 有人可以帮忙修改这段代码以使其独立于操作系统吗?
【解决方案2】:

Butterchicken 的解决方案还可以,但只能在英文版的 Windows 上运行。

更好的(与语言无关的)解决方案是匹配 MAC 地址的模式。这里我还要确保这个地址有一个关联的 IP(例如过滤掉蓝牙设备):

public String obtainMacAddress()
throws Exception {
    Process aProc = Runtime.getRuntime().exec("ipconfig /all");
    InputStream procOut = new DataInputStream(aProc.getInputStream());
    BufferedReader br = new BufferedReader(new InputStreamReader(procOut));

    String aMacAddress = "((\\p{XDigit}\\p{XDigit}-){5}\\p{XDigit}\\p{XDigit})";
    Pattern aPatternMac = Pattern.compile(aMacAddress);
    String aIpAddress = ".*IP.*: (([0-9]*\\.){3}[0-9]).*$";
    Pattern aPatternIp = Pattern.compile(aIpAddress);
    String aNewAdaptor = "[A-Z].*$";
    Pattern aPatternNewAdaptor = Pattern.compile(aNewAdaptor);

    // locate first MAC address that has IP address
    boolean zFoundMac = false;
    boolean zFoundIp = false;
    String foundMac = null;
    String theGoodMac = null;

    String strLine;
    while (((strLine = br.readLine()) != null) && !(zFoundIp && zFoundMac)) {
        Matcher aMatcherNewAdaptor = aPatternNewAdaptor.matcher(strLine);
        if (aMatcherNewAdaptor.matches()) {
            zFoundMac = zFoundIp = false;
        }
        Matcher aMatcherMac = aPatternMac.matcher(strLine);
        if (aMatcherMac.find()) {
            foundMac = aMatcherMac.group(0);
            zFoundMac = true;
        }
        Matcher aMatcherIp = aPatternIp.matcher(strLine);
        if (aMatcherIp.matches()) {
            zFoundIp = true;
            if(zFoundMac && (theGoodMac == null)) theGoodMac = foundMac;
        }
    }

    aProc.destroy();
    aProc.waitFor();

    return theGoodMac;
}

【讨论】:

  • 这仅适用于 Windows。获取独立于操作系统的 MAC 地址是否有更好的解决方案?
  • 不在 Java5 中,除非您重写此方法以在例如Unix 并根据系统属性“os.name”调用其中一个或另一个。在Java6中你可以。但问题是关于 Java5
  • 是的,因此我正在迭代。此解决方案仅适用于 Windows 中的 JDK 5,但不适用于其他操作系统。
  • 然后我将重新迭代:编写一个调用“ifconfig -a”并解析结果的等效函数 - 您可能需要进行调整以使其适用于不同风格的 Unix/Linux /OSX。根据 os.name 调用 Windows 版本或 *nix 版本。
  • 如果有多个适配器:getMacAddress()方法是否应该获取一个专用适配器的IP地址参数?
【解决方案3】:

据我所知,没有纯 Java 6 之前的解决方案。 UUID 解决了这个问题,但首先 determine OS 确定它是否应该运行 ifconfig 或 ipconfig。

【讨论】:

【解决方案4】:

在 Linux 和 Mac OS X 机器上,您可能必须使用 ifconfig -a
ipconfig 是 windows 命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多