现在通过路由器已知手机的ip是192.168.1.100,用这个IP通过下面的代码获得的NetworkInterface总为null。但是,局域网内运行此代码的台式机的IP为192.168.1.110,用这个IP通过下面的代码获得的NetworkInterface就正常,也能获得对应的MAC地址。请问这是怎么回事?
    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("没有找到目标客户端。");
        }
    }

解决方案 »

  1.   

    貌似你这种方法只能获取本机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; }}
      

  2.   


    Hi AA5279AA,用你的方法确实可以获取MAC地址了,不过其实我的需求是知道客户端的MAC地址的情况下,如何获取它的IP地址。当然先把局域网中所有可能的IP地址都ping一遍后再用arp -a就可以保证返回的信息里有我们需要的IP,但这样的效率实在太低了,请问有没有其它更有效率的办法?
      

  3.   


    Hi AA5279AA,用你的方法确实可以获取MAC地址了,不过其实我的需求是知道客户端的MAC地址的情况下,如何获取它的IP地址。当然先把局域网中所有可能的IP地址都ping一遍后再用arp -a就可以保证返回的信息里有我们需要的IP,但这样的效率实在太低了,请问有没有其它更有效率的办法?
    问你一个简单的问题。。
    mac就好比一间房主人的名字。
    ip等于门牌号。
    我可以根据门牌号找到这座房子,然后问主人的名字是什么。。
    但是我可以根据主人的名字找到这个门牌号么?当然,不要回答我说你可以向其他人打听,如果向其他人打印的话,那其实前提也是人家根据门牌号知道主人名而已。。
    除非主人出来喊一下,我的门牌号是什么什么,这样的话就等于目标机器向你发信息告诉你IP了。你要是问有什么更有效率的方法的话,应该就是多线程了。。
    一次ping等待返回的时间是比较长的,多线程的话就可以极大的缩短处于这个等待的时间。。
      

  4.   


    Hi AA5279AA,用你的方法确实可以获取MAC地址了,不过其实我的需求是知道客户端的MAC地址的情况下,如何获取它的IP地址。当然先把局域网中所有可能的IP地址都ping一遍后再用arp -a就可以保证返回的信息里有我们需要的IP,但这样的效率实在太低了,请问有没有其它更有效率的办法?
    问你一个简单的问题。。
    mac就好比一间房主人的名字。
    ip等于门牌号。
    我可以根据门牌号找到这座房子,然后问主人的名字是什么。。
    但是我可以根据主人的名字找到这个门牌号么?当然,不要回答我说你可以向其他人打听,如果向其他人打印的话,那其实前提也是人家根据门牌号知道主人名而已。。
    除非主人出来喊一下,我的门牌号是什么什么,这样的话就等于目标机器向你发信息告诉你IP了。你要是问有什么更有效率的方法的话,应该就是多线程了。。
    一次ping等待返回的时间是比较长的,多线程的话就可以极大的缩短处于这个等待的时间。。谢啦~对网络不是很懂,多谢指教~