JavaでPing操作をシミュレートするクラスを共有
3266 ワード
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によるシミュレーションです.中間クラスというのは、そのためにこのクラスを採用していないからです.
ここに貼っても記録でしょう.
もちろん、最終的な解決策を知りたい場合は、使用するコマンドライン操作を教えて、解析を行うことができます.