模擬Ping操作的一個Java類

podc9bw2 8年前發布 | 23K 次閱讀 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;
}

}</pre> 在類中使用的是:

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進行的模擬。

之所以說是中間類,也就是因為這個原因沒有采用這個類。

 

 本文由用戶 podc9bw2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!