现在通过路由器已知手机的ip是192.168.1.100,用这个IP通过下面的代码获得的NetworkInterface总为null。
但是,局域网内运行此代码的台式机的IP为192.168.1.110,用这个IP通过下面的代码获得的NetworkInterface就正常,也能获得对应的MAC地址。请问这是怎么回事?
Java code?public static void main(String[] args) throws Exception { String ip123 = "192.168.1."; boolean found = false; for (int ip4 = 100; ip4 < 200; ++ip4) { String curIp = ip123 + ip4; NetworkInterface ni; try { InetAddress ia = InetAddress.getByName(curIp); ni = NetworkInterface.getByInetAddress(ia); } catch (Exception e) { System.out.println("IP地址:" + curIp + "非法。"); continue; } if (null == ni) { continue; } else { String macStr = ""; byte[] mac = ni.getHardwareAddress(); for (int i = 0; i < mac.length; ++i) { if (i != 0) { macStr += "-"; } //mac[i] & 0xFF 是为了把byte转化为正整数 String curMacSection = Integer.toHexString(mac[i] & 0xFF); macStr += curMacSection; } String targetMac = "5C-E8-EB-BA-F3-D8"; if (0 == macStr.compareToIgnoreCase(targetMac)) { //在Windows资源管理器中打开ftp地址。 String cmd = "explorer ftp://" + curIp + ":2121"; Runtime.getRuntime().exec(cmd); found = true; break; } } } if (!found) { System.out.println("没有找到目标客户端。"); } } 貌似这种方法只能获取本机IP和MAC,java这方面貌似是方法提供了,还是获取不了。。还是用 Process proc = rt.exec(cmd); 的方式吧。。 提供一下代码,下面的方法可以获取对应ip下的mac。 package com; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public Test() { } public static void main(String[] args) { System.out.println(getMacAddress("192.168.1.100")); } public static String getMacAddress(String ip) { String macAddress = ""; macAddress = getMacInWindows(ip).trim(); if (macAddress == null || "".equals(macAddress)) { macAddress = getMacInLinux(ip).trim(); } return macAddress; } public static String getMacInLinux(final String ip) { String result = ""; String[] cmd = { "/bin/sh", "-c", "ping " + ip + " -c 2 && arp -a" }; String cmdResult = callCmd(cmd); result = filterMacAddress(ip, cmdResult, ":"); return result; } public static String callCmd(String[] cmd) { String result = ""; String line = ""; try { Process proc = Runtime.getRuntime().exec(cmd); InputStreamReader is = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader(is); while ((line = br.readLine()) != null) { result += line; } } catch (Exception e) { e.printStackTrace(); } return result; } public static String callCmd(String[] cmd, String[] another) { String result = ""; String line = ""; try { Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(cmd); proc.waitFor(); // 已经执行完第一个命令,准备执行第二个命令 proc = rt.exec(another); InputStreamReader is = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader(is); while ((line = br.readLine()) != null) { result += line; } } catch (Exception e) { e.printStackTrace(); } return result; } /** * * * * @param ip * 目标ip,一般在局域网内 * * @param sourceString * 命令处理的结果字符串 * * @param macSeparator * mac分隔符号 * * @return mac地址,用上面的分隔符号表示 */ public static String filterMacAddress(final String ip, final String sourceString, final String macSeparator) { String result = ""; String regExp = "((([0-9,A-F,a-f]{1,2}" + macSeparator + "){1,5})[0-9,A-F,a-f]{1,2})"; Pattern pattern = Pattern.compile(regExp); Matcher matcher = pattern.matcher(sourceString); while (matcher.find()) { result = matcher.group(1); if (sourceString.indexOf(ip) <= sourceString.lastIndexOf(matcher .group(1))) { break; // 如果有多个IP,只匹配本IP对应的Mac. } } return result; } /** * * * * @param ip * 目标ip * * @return Mac Address * * */ public static String getMacInWindows(final String ip) { String result = ""; String[] cmd = { "cmd", "/c", "ping " + ip }; String[] another = { "cmd", "/c", "arp -a" }; String cmdResult = callCmd(cmd, another); result = filterMacAddress(ip, cmdResult, "-"); return result; } }
|