分享Java中模擬Ping操作的一個類

似乎使用JavaPing的操作很少啊,不過我遇到了;最終解決了,在這裏貼出一箇中間過程中的類。

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

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

在這裏貼出來也算是一個記錄吧。


當然如果你想知道最終解決辦法,我可以告訴是使用的命令行操作,然後進行的解析。



發佈了82 篇原創文章 · 獲贊 709 · 訪問量 66萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章