首页 > 编程 > Java > 正文

模拟Ping操作的一个Java类

2019-11-26 14:29:35
字体:
来源:转载
供稿:网友

本文为大家分享了模拟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进行的模拟。
之所以说是中间类,也就是因为这个原因没有采用这个类。

以上就是本文的全部内容,希望对大家的学习有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表