草庐IT

android - 在 Android 中 Ping 一个 IP 列表

coder 2023-12-23 原文

我正在编写一个安卓应用程序。

当单击“自动扫描”按钮时,我有一项 Activity 负责 Pinging 254 IPv4 并将连接的机器放入数据库表中(放置 ip)。 //-------------------------------------------- ----------------------

首先我获得本地 IP(例如 192.168.1.8),然后当单击按钮时,我从 ip(例如 192.168.1.)中提取一个子字符串,然后开始 ping 从“192.168.1”开始的所有 IP。 1.1"并以“192.168.1.254”结尾。每次 ping 后,我都会进行测试以了解该 ping 是成功还是失败,如果成功则将该 ip 放入数据库表中,最后我在 ListView 中显示连接的 IP 列表。 //-------------------------------------------- ----------------------

问题是 Pinging 任务完成时间太长(大约 15 分钟或更长时间!!),这太疯狂了。 我尝试使用 InetAddress.isReachable() 它速度很快,但它找不到使用 Windows 的计算机,所以我改为使用 Process & Runtime.getRuntime().exec(cmd)。

在安卓代码下面:

class MyTask extends AsyncTask<String, Integer, Void> {         

    Dialog dialog;
    ProgressBar progressBar;
    TextView tvLoading,tvPer;
    Button btnCancel;

    @Override
    protected Void doInBackground(String... params) {
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

        String s="", address = params[0];
        int index=0,j=0,count=0;

        //on prend le dernier index du char "."
        final StringBuilder ss = new StringBuilder(address);
        index = ss.lastIndexOf(".");
        //on prend une souschaîne qui contient l'ipv4 sans le dernier nombre
        s = address.substring(0,index+1);

        //Tester tous les adresses Ipv4 du même plage d'adresses
        for(int i=1; i<255; i++){
            if (isCancelled()) {
                break;
            }
            if(testping(s+""+i+"")){
                insertIPv4(s+""+i+"");}
            count++;
            if(count == 5 && j<100){
                count=0;
                j+=2;
                publishProgress(j);
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result){
        super.onPostExecute(result);

        dialog.dismiss();

        AlertDialog alert = new AlertDialog.Builder(Gestion_Machines.this)
                .create();

        alert.setTitle("Terminé");
        alert.setMessage("Operation Terminé avec Succés");
        alert.setButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        alert.show();
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new Dialog(Gestion_Machines.this);
        dialog.setCancelable(false);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.progressdialog);

        progressBar = (ProgressBar) dialog.findViewById(R.id.progressBar1);
        tvLoading = (TextView) dialog.findViewById(R.id.tv1);
        tvPer = (TextView) dialog.findViewById(R.id.tvper);
        btnCancel = (Button) dialog.findViewById(R.id.btncancel);

        btnCancel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                objMyTask.cancel(true);
                dialog.dismiss();
            }
        });

        dialog.show();
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressBar.setProgress(values[0]);
        tvLoading.setText("Loading...  " + values[0] + " %");
        tvPer.setText(values[0]+" %");
    }
}

和使 ping 的方法:

public boolean testping(String x){
        int exit=22;
        Process p;

        try {
            //.....edited line.....
             p = Runtime.getRuntime().exec("ping -c1 -W1 "+x);
            //make shure that is -W not -w it's not he same.
             p.waitFor();
            exit = p.exitValue();
            p.destroy();
        } catch (IOException ee) {
            ee.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if (exit == 0) {
            return true;
        }else{
            return false;
        }
    }

最佳答案

我在网上搜索,我发现在 java 中,有些人使用了一个名为“fping”的命令,它接受以毫秒为单位的超时选项 (-t)。但是 android ( shell ) 中的 ping 命令只能接受秒超时。所以,就我而言,打洞操作应该需要 254 秒,还不错....但并不完美。

public boolean testping(String x){
    int exit=22;
    Process p;

    try {
        //.....edited line.....
         p = Runtime.getRuntime().exec("ping -c1 -W1 "+x);
        //make shure that is -W not -w it's not he same.
         p.waitFor();
        exit = p.exitValue();
        p.destroy();
    } catch (IOException ee) {
        ee.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    if (exit == 0) {
        return true;
    }else{
        return false;
    }
}

关于android - 在 Android 中 Ping 一个 IP 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601542/

有关android - 在 Android 中 Ping 一个 IP 列表的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby - RVM 使用列表[0] - 2

    是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  7. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  8. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  9. ruby - Ping ruby 网站? - 2

    在Ruby中可以使用哪些替代方法来ping一个ip地址?标准库“ping”库的功能似乎非常有限。我对在这里滚动我自己的代码不感兴趣。有没有好的gem?我应该接受它并忍受它吗?(我在Linux上使用Ruby1.8.6编写代码) 最佳答案 net-ping值得一看。它允许TCPping(如标准ruby​​ping),但也允许UDP、HTTP和ICMPping。ICMPping需要root权限,但其他则不需要。 关于ruby-Pingruby网站?,我们在StackOverflow上找到一个类

  10. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

随机推荐