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

mysweetie 2013-10-27 11:15:26
现在通过路由器已知手机的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("没有找到目标客户端。");
}
}
...全文
1054 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mysweetie 2013-10-27
  • 打赏
  • 举报
回复
引用 3 楼 AA5279AA 的回复:
[quote=引用 2 楼 mysweetie 的回复:] [quote=引用 1 楼 AA5279AA 的回复:] }[/code]
Hi AA5279AA,用你的方法确实可以获取MAC地址了,不过其实我的需求是知道客户端的MAC地址的情况下,如何获取它的IP地址。 当然先把局域网中所有可能的IP地址都ping一遍后再用arp -a就可以保证返回的信息里有我们需要的IP,但这样的效率实在太低了,请问有没有其它更有效率的办法?[/quote] 问你一个简单的问题。。 mac就好比一间房主人的名字。 ip等于门牌号。 我可以根据门牌号找到这座房子,然后问主人的名字是什么。。 但是我可以根据主人的名字找到这个门牌号么?当然,不要回答我说你可以向其他人打听,如果向其他人打印的话,那其实前提也是人家根据门牌号知道主人名而已。。 除非主人出来喊一下,我的门牌号是什么什么,这样的话就等于目标机器向你发信息告诉你IP了。 你要是问有什么更有效率的方法的话,应该就是多线程了。。 一次ping等待返回的时间是比较长的,多线程的话就可以极大的缩短处于这个等待的时间。。 [/quote] 谢啦~对网络不是很懂,多谢指教~
失落夏天 2013-10-27
  • 打赏
  • 举报
回复
引用 2 楼 mysweetie 的回复:
[quote=引用 1 楼 AA5279AA 的回复:] }[/code]
Hi AA5279AA,用你的方法确实可以获取MAC地址了,不过其实我的需求是知道客户端的MAC地址的情况下,如何获取它的IP地址。 当然先把局域网中所有可能的IP地址都ping一遍后再用arp -a就可以保证返回的信息里有我们需要的IP,但这样的效率实在太低了,请问有没有其它更有效率的办法?[/quote] 问你一个简单的问题。。 mac就好比一间房主人的名字。 ip等于门牌号。 我可以根据门牌号找到这座房子,然后问主人的名字是什么。。 但是我可以根据主人的名字找到这个门牌号么?当然,不要回答我说你可以向其他人打听,如果向其他人打印的话,那其实前提也是人家根据门牌号知道主人名而已。。 除非主人出来喊一下,我的门牌号是什么什么,这样的话就等于目标机器向你发信息告诉你IP了。 你要是问有什么更有效率的方法的话,应该就是多线程了。。 一次ping等待返回的时间是比较长的,多线程的话就可以极大的缩短处于这个等待的时间。。
mysweetie 2013-10-27
  • 打赏
  • 举报
回复
引用 1 楼 AA5279AA 的回复:
貌似你这种方法只能获取本机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;

	}

}
Hi AA5279AA,用你的方法确实可以获取MAC地址了,不过其实我的需求是知道客户端的MAC地址的情况下,如何获取它的IP地址。 当然先把局域网中所有可能的IP地址都ping一遍后再用arp -a就可以保证返回的信息里有我们需要的IP,但这样的效率实在太低了,请问有没有其它更有效率的办法?
失落夏天 2013-10-27
  • 打赏
  • 举报
回复
貌似你这种方法只能获取本机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;

	}

}

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧