您现在的位置: 爱51代码网 >> 范文 >> 文章正文
通过IP获取局域网内手机的NetworkInterface返回为null

现在通过路由器已知手机的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;       }   }

  • 上一篇文章:

  • 下一篇文章: 没有了
  • 最新文章 热点文章 相关文章
    GIS用百度行政区域的经纬度直接画
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    随机找出24个不一样的字,在把一
    java怎么实现html转为pdf
    lotus数据列表文档个数如何实时统
    lotus代理中LS如何将字符串保存到
    在lotus BS系统里怎样方便实现统
    不小心卸载了.net 4 extend,vs2
    C#byte【】里的数转换成string时
    C#的session取不到值
    java如何判断一个字符串里的数字
    java怎么实现html转为pdf
    在lotus BS系统里怎样方便实现统
    undefined reference timer_crea
    linux文件/usr/lib破坏了,还原后
    Failed to open eth0
    android手机无法与eclipse或电脑
    Hibernate优缺点有哪些
    Hibernate工作原理是什么
    java解析xml,如何拿到Test节
    client.executeMethod(httpp
    The APR based Apache Tomca
    tabPanel嵌套内部panel 内部
    failed to lazily initializ
    SSH框架在页面表单中的数据上
    ,<s:submit>怎么样做表单验
    Eclipse中怎样调试JSP页面
     



    设为首页 | 加入收藏 | 网站地图 | 友情链接 |