本文為大家分享了模擬Ping操作的一個Java類,具體內(nèi)容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
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 ; } } |
在類中使用的是:
1
2
3
4
5
|
long startTime = System.currentTimeMillis(); InetAddress address = InetAddress.getByName(Name); isArrived = address.isReachable(TimeOut); delay = System.currentTimeMillis() - startTime; ip = address.getHostAddress(); |
其中的:address.isReachable(TimeOut);方法,但是這個方法有一定局限性;當(dāng)是Root模式下會發(fā)送ICMP進行Ping操作,這就比較真實了;但是如果是非Root模式下則是使用的Socket進行的模擬。
之所以說是中間類,也就是因為這個原因沒有采用這個類。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。