【问题标题】:Ping every 5 seconds - Android每 5 秒 ping 一次 - Android
【发布时间】:2013-04-25 08:40:51
【问题描述】:

我已经编写了这段代码,用于在端口 6789 上 ping c 类 IP 地址,当我单击一个名为 PING 的按钮时,线程开始,它将检索所有打开端口 6789 的 IP 地址......但我需要的是每隔 5 秒刷新(重新 ping)一次,并添加最近加入的 ip(如果存在)并忽略离开端口的 ip。 我调试并搜索了几个小时但没有希望!

提前感谢:DD

Thread pingo = new Thread(new Runnable() {
            public void run() {

                if (readableNetmask.equals("255.255.255.0")) {

                    for (int i = 2; i <= 254; i++) {

                        String ip_address = readableIPAddress;
                        String oct1 = "", oct2 = "", oct3 = "", oct4 = "";

                        StringTokenizer stok = new StringTokenizer(
                                ip_address, ".");

                        while (stok.hasMoreTokens()) {
                            oct1 = stok.nextToken();
                            oct2 = stok.nextToken();
                            oct3 = stok.nextToken();
                            oct4 = stok.nextToken();
                        }

                        to_ping_ip = oct1 + "." + oct2 + "." + oct3 + "."
                                + String.valueOf(i);

                        if (pingAddress(to_ping_ip, 6789)) {
                            handler.post(new UpdateIPListViewRunnable());
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            // ips_List.add(to_ping_ip);
                        }

                    }
                }

            }
        });

        pingo.start();

PingAddress() 函数:

public boolean pingAddress(String ip, int port) {

    Socket socket = new Socket();
    try {

        socket.connect(new InetSocketAddress(ip, port), 200);
        socket.close();

    } catch (IOException e) {
        return false;
    }
    return true;
}

列出地址出现的位置:

static public class UpdateIPListViewRunnable implements Runnable {
    public void run() {
        arrayAdapter.add(to_ping_ip);
        arrayAdapter.notifyDataSetChanged();
    }
}

【问题讨论】:

  • 您的代码中似乎没有任何内容涉及任何“在 5 秒内再做一次”——这使得您很难理解您尝试过的内容。如您所说,您的问题是关于在 5 秒内重试,还是只是让单个 ping 工作?请更简洁。
  • 抱歉含糊不清,但我没有提到我已经尝试过(我已经搜索过)。我有这段代码,每个 ip (1-254) 一次 ping 工作正常,但我希望它每 5 秒自动 ping 一次,以便了解哪些 IP 已加入、离开或仍在该端口上...谢谢

标签: android multithreading ping


【解决方案1】:

只需添加一个包含 5 秒睡眠的循环,如下所示。我想您已经可以将新的 ping 结果整合到您之前捕获的数据中。

Thread pingo = new Thread(new Runnable() {
        public void run() {
            while (true) {
                if (readableNetmask.equals("255.255.255.0")) {
                    // keep the above logic
                }

                // delay 5 seconds
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
    });

    pingo.start();

【讨论】:

  • 你的意思是Thread.sleep(5000) 5 秒。非常感谢你,我很感激;D
  • mmm 不幸的是,出现了另一个问题:( ...当我启动应用程序时,while (true) 的第一次迭代工作得很好,它添加了任何打开端口 6789 的 ip,当另一个设备加入端口,我的手机会将其添加到列表中......但是在第二次迭代中,当 ping 到先前 ping 的 ip 时...... Socket 将抛出 IOException(如代码中所写)我不知道为什么:???
【解决方案2】:

这应该对你有帮助。

private void doPing() {
    if (readableNetmask.equals("255.255.255.0")) {
    // Your logic 
    }
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            doPing();
        }
    }, 5*1000);
}

【讨论】:

  • 这会起作用,但是它会导致在 UI 线程上执行后续的 doPing() 调用。如果doPing() 改为启动一个新线程来执行 ping 逻辑会更好。
  • 如果我们不想在doPing() 中做任何 UI 工作,您的逻辑会更好。接受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多