2013-05-01 93 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