最近在研究網(wǎng)絡(luò)蓬推,想知道一個網(wǎng)段中萍丐,有哪些IP可以被Ping通。
通過cmd的ping命令有點慢...
于是用了一個簡短的Java代碼來尋找某網(wǎng)段中可以連接成功的IP地址蝙寨。
1.食材準備:
- 通過
Runtime.getRuntime().exec( "指令" )
可以執(zhí)行windows cmd的指令计技。 - 通過
Process p = Runtime.getRuntime().exec( "指令" )
來存儲exec的返回進程喜德。 - 通過
p.getInputStream()
可以獲取cmd上執(zhí)行了命令后的輸出。返回類型為InputStream酸役。 - 對了,還要一點IO流的知識驾胆。這里通過的是字符流 InputStreamReader 和 BufferedReader涣澡。編碼格式為GBK。
- 還用了線程丧诺,記得lambda表達式里的 ip表示 必須是final 常量入桂。
2.一切就緒,源碼上:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Ping {
public static void main(String[] args) {
Ping p = new Ping();
for(int i=1; i<255; i++){
final int ip = i;
new Thread(()->p.ping(ip)).start();
}
}
boolean ping(int i){
String ip = "202.100.68."+i;
String ins = "ping "+ ip;
try{
Process p = Runtime.getRuntime().exec(ins);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream(),"GBK"));
String line = null;
while((line = reader.readLine())!=null){
if(line.indexOf("來自")!=-1){ //這里不同的cmd可能不一樣
System.out.println(ip+" 連接成功");
return true;
}
if(line.indexOf("請求超時")!=-1){ //這里也是
System.out.println(ip+" 連接失敗");
return false;
}
}
}catch(IOException e){
e.printStackTrace();
}
return false;
}
}
3.說明和解釋
隨便建一個包驳阎,建立一個Ping類抗愁。把源碼拷貝過去就行了。
我這里用了硬編碼呵晚,以蘭州的某一個網(wǎng)段為例蜘腌,把ip寫死了,用的時候可以自己改一下饵隙。詳見ping函數(shù)里第一行String ip = "202.100.68."+i;
還有針對每個電腦ping通撮珠,ping不通的提示可能不太一樣。
我家的ping通了會有 “來自xxx的回復(fù)” 金矛。所以就以來自為關(guān)鍵字芯急,判斷是否ping通了。
沒ping通的時候是 “請求超時”驶俊。
4.運行結(jié)果:
后面就不放了娶耍,一共執(zhí)行了1~254個ping命令。