加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

模拟Ping操作的一个Java类

发布时间:2020-12-15 03:13:04 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import java.io.IOException;import java.net.InetAddress;import java.net.UnknownHostException;/** * Created by QiuJU * on 2014/9/21. */public

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

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进行的模拟。

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读