Android代码中使用Ping命令

项目中需要搜索同一WIFI局域网中的设备并进行通信,暂时想到的办法是得到局域网网段的地址,因为同一局域网中的IP地址前三位是相同的,而第四位的范围从0~250,所以对第四位进行遍历搜索,能ping通的IP加入在线列表,再用IP进行通信。由于遍历过程非常耗时,需要开启多线程去PING.开销不能太大,最多开启30个线程。

需要在Android中使用LInux底层的命令:

如执行Ping命令 格式为  ping -c 1 -w 5

其中参数-c 1是指ping的次数为1次,-w是指执行的最后期限,单位为秒,也就是执行的时间为5秒,超过5秒则失败.

Ping命令代码:

Process p = Runtime.getRuntime().exec("ping -c 1 -w 5 " + ip);

主要的代码部分:

public void runPingIPprocess(final String ipString)
	{
		final Thread pingThread = new Thread()
		{
			@Override
			public void run()
			{
				try
				{
					Log.i("Light", "ip address" + ipString);
					// ping ip地址
					Process p = Runtime.getRuntime().exec(
							"ping -c 1 -w 5 " + ipString);
					int status = p.waitFor();
					if (status == 0)
					{
						Log.i("Light", "ping ip");
						Map<String, Object> map = new HashMap<String, Object>();
						map.put("ip", ipString);
						ping.add(map);
						pingSize++;
						if (pingSize > 10)
						{
							pingSize = 0;
							// setPing(ping);
							mUpdaHandler.sendMessage(createMessage(RESULT_MESSAGE, ping));
						}
					} else
					{
					}
					threadCount--;
				} catch (Exception e)
				{
					threadCount--;
					Log.e("Light", e.getLocalizedMessage());
				} finally
				{
				}
			}
		};
		pingThread.start();
	}


主要来讲讲 Runtime.exec这个方法

Runtime 封装着java程序的运行时环境。通过Runtime实例,java应用能够与其运行的环境连接。Runtime在jvm中保持一个单例,所以不能通过Runtime类的构造函数。只能通过Runtime.getRuntime()来获的当前Runtime的一个实例。获得Runtime实例后,就可以通过Runtime的exec()方法在当前jvm进程外启动其他进程了。

在Runtime类中存在四个exec()重载方法

public Process exec(String command);
public Process exec(String [] cmdArray);
public Process exec(String command, String [] envp);
public Process exec(String [] cmdArray, String [] envp);

对于每个这样的方法,都会产生一个命令,并可能携带一组参数——被传递给一个特定操作系统的函数调用。随后创建一个特定操作系统的进程(一个运行着的程序),procss类将持有该程序返回Java VM的引用。这个procss类是一个抽象类,具体子类的实现依赖于不同的底层操作系统。

 

你可以通过三种可能的输入参数到这些方法:

1、一个字符串,表示程序执行和程序的任何参数。

2、一个字符串数组,通过参数来区分出程序的实现功能。

3、一个环境变量的数组

传递环境变量是,使用格式化的方式:名称=值。如果你使用单个字符串和它的参数的方式调用exec()的重载,,注意字符串是通过StringTokenizer类被解析,使用空格作为分隔符

关于Runtime类使用陷阱可以看看这篇文章:

http://www.cfanz.cn/index.php?c=article&a=read&id=33583


完整的实例代码: 

http://download.csdn.net/detail/u011176244/6348059




原文地址:https://www.cnblogs.com/krislight1105/p/3748352.html