在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

模拟Ping操作的一个Java类

2016-8-29 13:25| 发布者: zhangjf| 查看: 528| 评论: 0

摘要: 本文为大家分享了模拟Ping操作的一个Java类,具体内容如下 import java.io.IOException;import java.net.InetAddress;import java.net.UnknownHostException; /** * Created by QiuJU * on 2014/9/21. */public clas ...

本文为大家分享了模拟Ping操作的一个Java类,具体内容如下

  1. import java.io.IOException;
  2. import java.net.InetAddress;
  3. import java.net.UnknownHostException;
  4. /**
  5. * Created by QiuJU
  6. * on 2014/9/21.
  7. */
  8. public class SimplePing implements Runnable {
  9. private final Object mEndLock = new Object();
  10. private boolean IsEnd = false;
  11. private int arrivedCount = 0;
  12. private int Count;
  13. private int TimeOut;
  14. private String Name;
  15. private int mEndCount;
  16. private String mIp = null;
  17. private float mLossRate = 1f;
  18. private float mDelay = 0;
  19. public SimplePing(String name, int count, int timeOut) {
  20. Count = mEndCount = count;
  21. TimeOut = timeOut;
  22. Name = name;
  23. for (int i = 0; i < mEndCount; i++) {
  24. Thread thread = new Thread(this);
  25. thread.setDaemon(true);
  26. thread.start();
  27. }
  28. if (!IsEnd) {
  29. try {
  30. synchronized (mEndLock) {
  31. mEndLock.wait();
  32. }
  33. } catch (InterruptedException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }
  38. private void setEnd(boolean isArrived, long delay, String ip) {
  39. synchronized (mEndLock) {
  40. Count--;
  41. if (isArrived) {
  42. arrivedCount++;
  43. mDelay = (mDelay + delay) / 2f;
  44. if (ip != null)
  45. mIp = ip;
  46. }
  47. }
  48. if (Count == 0)
  49. setEnd();
  50. }
  51. private void setEnd() {
  52. mLossRate = (mEndCount - arrivedCount) / mEndCount;
  53. IsEnd = true;
  54. synchronized (mEndLock) {
  55. mEndLock.notifyAll();
  56. }
  57. }
  58. @Override
  59. public void run() {
  60. long delay = 0;
  61. boolean isArrived = false;
  62. String ip = null;
  63. try {
  64. long startTime = System.currentTimeMillis();
  65. InetAddress address = InetAddress.getByName(Name);
  66. isArrived = address.isReachable(TimeOut);
  67. delay = System.currentTimeMillis() - startTime;
  68. ip = address.getHostAddress();
  69. } catch (UnknownHostException e) {
  70. e.printStackTrace();
  71. } catch (IOException e) {
  72. e.printStackTrace();
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. } finally {
  76. setEnd(isArrived, delay, ip);
  77. }
  78. }
  79. public String getIp() {
  80. return mIp;
  81. }
  82. public float getLossRate() {
  83. return mLossRate;
  84. }
  85. public float getDelay() {
  86. return mDelay;
  87. }
  88. public boolean getIsSucceed() {
  89. return arrivedCount > 0;
  90. }
  91. }
复制代码

在类中使用的是:

  1. long startTime = System.currentTimeMillis();
  2. InetAddress address = InetAddress.getByName(Name);
  3. isArrived = address.isReachable(TimeOut);
  4. delay = System.currentTimeMillis() - startTime;
  5. ip = address.getHostAddress();
复制代码

其中的:address.isReachable(TimeOut);方法,但是这个方法有一定局限性;当是Root模式下会发送ICMP进行Ping操作,这就比较真实了;但是如果是非Root模式下则是使用的Socket进行的模拟。
之所以说是中间类,也就是因为这个原因没有采用这个类。

以上就是本文的全部内容,希望对大家的学习有所帮助。

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-7 17:57

Copyright 2015-2025 djqfx

返回顶部