JAvaコード実装pingコマンド(linuxシステムサポート)


一.現在のOSのタイプを検出
String osName = System.getProperty("os.name");//        
String command = "";
if(osName.contains("Linux")){
  command = "ping -c 100 -i 0"+ip;
}else if{
  command = "ping -n 5 -w 1000"+ip;
}
Properties props=System.getProperties(); //           
String osName = props.getProperty("os.name"); //          
String osArch = props.getProperty("os.arch"); //          
String osVersion = props.getProperty("os.version"); //       

二.LinuxとWindowsのping命令の紹介
.Pingコマンドは、インターネット制御メッセージプロトコル(ICMP)エコー要求メッセージを送信することにより、他のTCP/IPコンピュータとのIPレベル接続を検証する
.Pingコマンドは一般的にネットワークの通信と通信の有無を検出するために用いられ、遅延とも呼ばれ、その値が大きいほど速度が遅いPING(PacketInternetGroup)、インターネットパケット探索器は、ネットワーク接続量をテストするプログラムに用いられる.
.Pingは、ICMPエコー要求メッセージを宛先に送信し、所望のICMPエコー応答が受信されたか否かを報告する.ネットワークがスムーズであるか、ネットワーク接続速度が速いかを確認するコマンドです.
.原理:ネットワーク上の机械はすべて唯一确定したIPアドレスがあって、私达は目标のIPアドレスに1つのパケットを送って、相手は1つの同じ大きさのパケットを返して、返したパケットによって私达は目标のホストの存在を确定することができて、初歩的に目标のホストのオペレーティングシステムなどを判断することができます.
Pingのワークフロー
.1,同一のセグメント内にある.ping .ホストA——————>ホストB.ICMP要求パッケージ本機(ホストA)でARPキャッシュテーブルを検索ホストBのIPとそれに対応するMACを検索する.ホストBのIPとそのMACとのマッピング関係が見つからない場合、arp要求ブロードキャストが送信される.ホストBはarp要求パケットを受け取ると、1つのarp応答パケット(自機のMACを含む)に返信する.ホストAICMP応答パケット.2は、同一のセグメントにない.ホストA上で「pingホストC(同一のネットワークセグメントではない)」を実行した後、上記と同様に、MACアドレスをどのように取得するかを開始すると、IPプロトコルは計算によってC機が自分と同じネットワークセグメント内にいないことを発見し、直接ルーティング処理、すなわちルーティングされたMACを取り出し、どのようにルーティングされたMACを得るかについては、上記と同様に、まずARPキャッシュテーブルで探し、見つからない場合はブロードキャストパケット、ルーティングは、このデータフレームを取得した後、ホストcに連絡し、見つからない場合は、ホストAにタイムアウトの情報を返す.
Linuxのpingコマンドの使用
.pingコマンドの一般的なフォーマットは、ping[-dfnqrRv][-c送信回数][-i間隔秒数][-Iネットワークインタフェース][-lプリロード][-pパターン][-sパケットサイズ][-t生存数値][ホスト名またはIPアドレス][-ccount]送信(または受信)する返信信号要求の数を指定し、Count変数で示す.[-wtimeout]このオプションは、-cオプションとともにのみ機能します.pingコマンドは、応答を最も長いタイムアウト時間で待機させます(最後のパケットを送信した後).デフォルトタイムアウト時間は4000 ms(4 s)[-d]SocketのSO_DEBUG機能を使用しますhttp://blog.csdn.net/zhangxinrun/article/details/7207733
三.pingコマンドのJavaコード
Runtime runtime = Runtime.getRuntime();
Process process;
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is,Charset.forName("GBK"));
BufferedReader br = new BufferedReader(isr);
String line="";
String status = "";
String packetLoss = "";
String timeout = "";
while ((line = br.readLine())!=null){
Boolean bl = !"".equals(line);
//  Linux OS
if(line.indexOf("packet loss")!=-1 && b1){
  String[] str = line.split(",");
  packetLoss = str[2].replace("packet loss","").trim();
  status = ip+":----->   :"+packetLoss;
}else if(line.indexOf("min/avg/max/mdev") !=-1&&b1){
  timeout = line.split("=")[1].split("/")[1];
  status+="----->  :"+timeout+"ms"
}
//  windows os
else if(line.indexOf("  ") !=-1&&b1){
packetLoss = line.subString(line.indexOf("(")+1,line.indexOf(")").repalce("  """).replace("%","").trim())
}else if(line.indexOf("  ")!=-1&&b1){
  timeout = line.substring(line.indexof("  ").split("=")[1].trim())
}
}

个人の総括:プロジェクトの中で私は事前に1つのIPのネットのリンクの情况を监视する必要があって、初めはこのように书く原理を理解していないで、それから书いた后に私は理解して、実はjavaがpingコマンドを実现するのはcmdでpingコマンドを実行して、javaの方法を通じてcmdをスタートしてpingコマンドを実行して、それから自分の望む结果に解析します.