| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
podc9bw2
10年前发布

模拟Ping操作的一个Java类

import java.io.IOException;  import java.net.InetAddress;  import java.net.UnknownHostException;    /**   * Created by QiuJU   * on 2014/9/21.   */  public class SimplePing implements Runnable {      private final Object mEndLock = new Object();      private boolean IsEnd = false;        private int arrivedCount = 0;        private int Count;      private int TimeOut;      private String Name;        private int mEndCount;      private String mIp = null;      private float mLossRate = 1f;      private float mDelay = 0;          public SimplePing(String name, int count, int timeOut) {          Count = mEndCount = count;          TimeOut = timeOut;          Name = name;          for (int i = 0; i < mEndCount; i++) {              Thread thread = new Thread(this);              thread.setDaemon(true);              thread.start();          }          if (!IsEnd) {              try {                  synchronized (mEndLock) {                      mEndLock.wait();                  }              } catch (InterruptedException e) {                  e.printStackTrace();              }          }      }        private void setEnd(boolean isArrived, long delay, String ip) {          synchronized (mEndLock) {              Count--;              if (isArrived) {                  arrivedCount++;                  mDelay = (mDelay + delay) / 2f;                  if (ip != null)                      mIp = ip;              }          }          if (Count == 0)              setEnd();      }        private void setEnd() {          mLossRate = (mEndCount - arrivedCount) / mEndCount;            IsEnd = true;          synchronized (mEndLock) {              mEndLock.notifyAll();          }      }        @Override      public void run() {          long delay = 0;          boolean isArrived = false;          String ip = null;          try {              long startTime = System.currentTimeMillis();              InetAddress address = InetAddress.getByName(Name);              isArrived = address.isReachable(TimeOut);              delay = System.currentTimeMillis() - startTime;              ip = address.getHostAddress();          } catch (UnknownHostException e) {              e.printStackTrace();          } catch (IOException e) {              e.printStackTrace();          } catch (Exception e) {              e.printStackTrace();          } finally {              setEnd(isArrived, delay, ip);          }      }        public String getIp() {          return mIp;      }        public float getLossRate() {          return mLossRate;      }        public float getDelay() {          return mDelay;      }        public boolean getIsSucceed() {          return arrivedCount > 0;      }  }
在类中使用的是:
long startTime = System.currentTimeMillis();              InetAddress address = InetAddress.getByName(Name);              isArrived = address.isReachable(TimeOut);              delay = System.currentTimeMillis() - startTime;              ip = address.getHostAddress();
其中的:address.isReachable(TimeOut);方法,但是这个方法有一定局限性;当是Root模式下会发送ICMP进行Ping操作,这就比较真实了;但是如果是非Root模式下则是使用的Socket进行的模拟。

之所以说是中间类,也就是因为这个原因没有采用这个类。