2013-05-01 52 views
0

我已经写在端口6789查验C类IP地址,这个代码,线程开始时,我点击了一个名为Ping按钮,它会检索一个端口6789打开的所有IP地址.. 。但我需要的是刷新(重新ping)每一个,让我们说5秒,并添加ips最近加入,如果存在,并省略离开港口的。 我调试了几个小时,但没有希望!!!平每5秒 - Android电子

在此先感谢: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(); 
    } 
} 
+0

您的代码中似乎没有涉及任何“5秒钟内重做”的内容 - 这使得很难理解您尝试过的内容。你的问题是在5秒钟内重试,或者只是让单个ping工作?请更简洁。 – mah 2013-05-01 10:46:15

+0

道歉的模糊性,但我没有提到,我已经尝试过(我已经搜查)。我有这个代码,它工作正常,每个ip(1-254)一个ping,但我希望它每5秒自动ping,所以要更新哪些IP加入,离开或仍然在该端口上...谢谢你 – spac3hit 2013-05-01 10:56:11

回答

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(); 
+0

你的意思是'Thread.sleep(5000)'5秒。 非常感谢你我很感激; d – spac3hit 2013-05-01 11:12:37

+0

是的,你说得对,我们对此深感抱歉!出现d NOP ......... – mah 2013-05-01 11:26:46

+0

6789开启,而当其他设备连接的端口,我的手机会执行ping到IP时,先前执行ping操作将其添加到列表......但在第二次迭代...插座将抛出IOException(如写在代码),我不知道为什么: spac3hit 2013-05-01 12:11:56

0

这应该对你有所帮助。

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

这工作,但它会导致后续'掺杂()'调用在UI线程上执行这将是更好的,如果'掺杂()',而不是开始。新的线程执行ping逻辑。 – mah 2013-05-01 11:28:59

+0

在这种情况下,我们不希望做任何UI的东西在'兴奋剂()',你的逻辑是更好的。接受! – 2013-05-01 11:36:08

+0

第一解决方案为我,谢谢@SagarWaghmare – spac3hit 2013-05-01 12:14:11