当前位置:   article > 正文

Android代码中使用Ping命令_android ping -w

android ping -w

项目中需要搜索同一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);

主要的代码部分:

  1. public void runPingIPprocess(final String ipString)
  2. {
  3. final Thread pingThread = new Thread()
  4. {
  5. @Override
  6. public void run()
  7. {
  8. try
  9. {
  10. Log.i("Light", "ip address" + ipString);
  11. // ping ip地址
  12. Process p = Runtime.getRuntime().exec(
  13. "ping -c 1 -w 5 " + ipString);
  14. int status = p.waitFor();
  15. if (status == 0)
  16. {
  17. Log.i("Light", "ping ip");
  18. Map<String, Object> map = new HashMap<String, Object>();
  19. map.put("ip", ipString);
  20. ping.add(map);
  21. pingSize++;
  22. if (pingSize > 10)
  23. {
  24. pingSize = 0;
  25. // setPing(ping);
  26. mUpdaHandler.sendMessage(createMessage(RESULT_MESSAGE, ping));
  27. }
  28. } else
  29. {
  30. }
  31. threadCount--;
  32. } catch (Exception e)
  33. {
  34. threadCount--;
  35. Log.e("Light", e.getLocalizedMessage());
  36. } finally
  37. {
  38. }
  39. }
  40. };
  41. pingThread.start();
  42. }

主要来讲讲 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




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/934204
推荐阅读
相关标签
  

闽ICP备14008679号