zoukankan      html  css  js  c++  java
  • 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




  • 相关阅读:
    linux面试常问命令
    图卷积网络 GCN Graph Convolutional Network(谱域GCN)的理解和详细推导
    总结一些牛客网上 的算法岗面试题
    Pytorch-Tensor基本操作
    C++使用代码创建一个Windows桌面应用程序
    Windows中的消息与消息队列
    解决COM组件在WPF设计器中命名空间不存在XXX的问题(附带如何在WPF中使用APlayer引擎)
    Mybatis的一级缓存
    面试题:zookeeper实现分布式锁
    sublime text 文件默认打开格式
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748352.html
Copyright © 2011-2022 走看看