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

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

在这里贴出来也算是一个记录吧。

当然如果你想知道最终解决办法,我可以告诉是使用的命令行操作,然后进行的解析。

时间: 2024-12-17 22:08:32

分享Java中模拟Ping操作的一个类的相关文章

java中的集合操作类(未完待续)

申明: 实习生的肤浅理解,如发现有错误之处,还望大牛们多多指点 废话 其实我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList<XXXXX>(); 但是我仅仅只是了解,list这个类是一个可变长用来存储的对象实例的类,我甚至觉得这个List对象可以理解成数组,但是却又与java中咱们正常理解的数组很多的不同,比如说,他的长度可以随着需要自动增长,比如说,实例化一个List类就和咱们声明数组的时候是不一样的! 今天的实习生活

java中可以让实例改变了类Feild(java这么干就是一个错误,你看到了就当做是类在该修改或这个类Feild)

class Person { public String name;//定义实例Feild public static int eyeNum;//定义类Feild } public class PersonTest { public static void main(String[] args) { System.out.println("Person的eyeNum的类Feild值是:" + Person.eyeNum); } } 运行: [[email protected] java

分享java中排除特出字符方法

public static boolean stringFilter(String str)throws PatternSyntaxException{ String regEx="[`[email protected]#$%^&*+=|{}':;',\\[\\].<>/?~!@#¥%……&*——+|{}[]‘::”“’.,.?\\\\]"; // String regEx = "[^a-zA-Z0-9]"; Pattern p = Pa

Java中如何使封装自己的类,建立并使用自己的类库?

转自:http://blog.csdn.net/luoweifu/article/details/7281494 随着自己的编程经历的积累会发现往往自己在一些项目中写的类在别的项目中也会有多次用到.你肯定会想:如何自己的写的一些常用的类积累起来,生成自己的类库?如果是这样的话,很庆幸,你遇到通道中人了,因为我也是这样做的.下面就介绍一下我是怎么做的吧 一.先来明白一下关于classpath和path的概念 path是java中用来进行编译和运行的程序所在的路径,而classpath是类所在的路径

全面解释java中StringBuilder、StringBuffer、String类之间的关系

http://www.jb51.net/article/33398.htm String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象,StringBuffer和StringBuilder类功能基本相似 1. String 类  String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不

Java中的日期操作

Date : getTime() .setTime() SimpleDateFormate :   Formate(Date). parse(String s) Calendar : getInstance().set() .get().getActualMaximum().add().  gettime().setTime(Date). 字符串.Date.Calendar之间的转换 ---------------------------------------淫荡分隔-------------

java学习系列(一)Java中的IO操作

Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入\输出操作,在Java中把不同的输入\输出源抽象为"流",通过流的方式允许Java程序使用相同的方式来访问不同的输入/输出源.stream是从起源(source)到接收(sink)的有序数据. Java把所有传统的流类型(类或抽象类)都放在java.io包中,用以实现输入\输出功能. JavaAPI 1.6中java.io包 1.子节流  * 输入字节流 * -------------|InputStream 所有输入字

java入门学习笔记之2(Java中的字符串操作)

因为对Python很熟悉,看着Java的各种字符串操作就不自觉的代入Python的实现方法上,于是就将Java实现方式与Python实现方式都写下来了. 先说一下总结,Java的字符串类String本身定义了一些简单的字符串操作, 字符串常用操作有: 1. 取某一字符第一次出现/最后一次出现的索引 2. 取字符串某一位置的字符 3. 字符串截取 4. 去除首尾空格 5. 字符串字符替换 6. 判断两个字符串是否相等 7. 大小写转换 下面开始: 1.取某一字符第一次出现/最后一次出现的索引 JA

Java中的文件操作

在使用计算机编程中,常常会用到对于文件的操作,以下是我对于Java中文件的相关内容学习之后的一个总结和在学习过程中遇到的一些问题. 一.什么是文件 对于文件进行操作,首先我们要知道什么是文件.在此之前,我们要知道,计算机其实就是一个文件系统.在计算机中,我们能在硬盘中看到的所有东西都叫文件.由此看来,计算机中文件是一个很广的范围.事实上,计算机中文件被分为了3种,一个是标准文件,一个是目录文件,还有一个就是虚拟内存文件. 这三种对于文件的分类没有一个明确的定义,后缀名是(.txt..doc..m