如何在Android应用中同时ping一系列IP地址

时间:2014-11-16 23:56:31

标签: java android android-studio

您好,感谢您的期待。

我希望能够从Android应用程序同时ping多个IP地址。我已经编写了下面的代码,希望能够打电话给我的" Ping Something"方法在不同的线程上多次。如果我这样做的话,结果都会相互干扰,基本上最后运行的线程会覆盖所有其他线程。实现目标的最佳方式是什么?即能够从Android应用程序ping多个IP地址,而无需等待以前的结果完成。

非常感谢您提前提供任何帮助。

纳特

这可以通过计时器或按下按钮来调用.......

        new Thread(new Runnable() {
            public void run() {
                PingSomething("www.bbc.co.uk");
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                PingSomething("someotherip");
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                PingSomething("anotherip");
            }
        }).start();

这是我在某种程度上简化的方法......

    public void PingSomething (String ahost) {
    String pingResult;
    Boolean noresponse, response;
    String inputLine;
    InetAddress theaddress;

    try {
        theaddress = InetAddress.getByName(ahost);
        ahost = theaddress.getHostAddress();
    } catch (UnknownHostException e) {
        ahost = "noip";
    }

    String pingCmd = "ping -c 1 -t 5000 -w 1 -W 1  " + ahost;

    try {

    Runtime r = Runtime.getRuntime();
    Process p = r.exec(pingCmd);
    BufferedReader in = new BufferedReader(new
            InputStreamReader(p.getInputStream()));
    inputLine = "";
    pingResult = "";
    while ((inputLine = in.readLine()) != null) {
        pingResult = pingResult + (inputLine + "\n");
    }
    // Do something with pingResult
final String temppingresults = pingResult;

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(), temppingresults, Toast.LENGTH_SHORT).show();

                        }
                    });
}

2 个答案:

答案 0 :(得分:0)

每个线程都使用相同的变量。因此,线程1/2/3正在并发运行,但它们都写入相同的变量,因此最后终止的线程最终将是写入变量的最后一个。您需要创建新方法,每个线程一个。

例如,PingSomethingPingSomething2PingSomething3,每个都有自己的方法和变量。例如,PingSomething2将具有以下变量:

String pingResult2;
Boolean noresponse2, response2;
String inputLine2;
InetAddress theaddress2;

依此类推。

答案 1 :(得分:0)

对我来说:ping -c 1 -t 5000 -w 1 -W 1

给出关于ttl超出范围的错误

试试这个:

String[] commands = {"ping host1 &","ping host2 &" };

runAsRoot(commands);

public void runAsRoot(String[] cmds){
        Process p;
        try {
            p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());

            for (String tmpCmd : cmds) {
                    os.writeBytes(tmpCmd+"\n");
            }           

            os.writeBytes("exit\n");  
            os.flush();
            p.waitFor();
            Log.d("URL" ,"su commands success");

        } catch (IOException e) {
            Log.d("URL" ,"su command failed");
        } catch (InterruptedException e) {
            Log.d( "URL" ,"su command failed (waitfor failed)" );
            e.printStackTrace();
        }

    }

直接从管道读取或尝试重定向输出,如果您需要输出ping的结果

ping -q -c 1 google.com> / dev / null 2> / dev / null&&在线回音|| echo offline

后者阅读该日志或您的选择

你可以替换' su'用' sh'在p = Runtime.getRuntime()。exec(" su"),你和root用户一起运行。如果您添加'&' (" ping host1&")ping将在后台运行并且所有ping都在同一时间运行,因此您可以在bacgkround中运行尽可能多的ping,并且可以将每个ping重定向到日志文件并从java代码中读取该日志文件。