首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

透过IP获取局域网内手机的NetworkInterface时总返回null

2013-10-29 
通过IP获取局域网内手机的NetworkInterface时总返回null现在通过路由器已知手机的ip是192.168.1.100,用这

通过IP获取局域网内手机的NetworkInterface时总返回null
现在通过路由器已知手机的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("没有找到目标客户端。");
        }
    }


[解决办法]
貌似你这种方法只能获取本机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;

}

}

热点排行