在网管的设计中,经常要对ip资源进行扫描,来确定ip资源使用情况和历史的活跃ip。传统的办法就是对路由交换的fdb和arp的数据进行分析,然后得出ip的资源信息。但是在经常的情况。


     但是很多分析一个ip段的数据,有时候因为网络的复杂,无法准确取到ip相关信息,造成ip资源扫描的误差。这里我们主要介绍2个算法,都是通过多线程来扫描一个网段的ip资源和一个设备的端口资源。

     核心的分析类的源代码:


[java] view plain copy
  1. package com.shine.NetAnalisys;  

  2. import java.util.List;  

  3. import com.shine.NetAnalisys.model.NetAnalyzeCallBack;  

  4. import com.shine.NetAnalisys.threadModel.NetPortThreadModel;  

  5. import com.shine.NetAnalisys.threadModel.NetScanThreadModel;  

  6. import com.shine.NetAnalisys.util.NetWorkUtil;  

  7. import com.shine.framework.ThreadPoolUtil.ThreadPoolManager;  

  8. import com.shine.framework.ThreadPoolUtil.util.SuperThread;  

  9. /**

  10. * 网络分析类库 主要包括ip扫描,端口分析

  11. *

  12. * @author [email protected]

  13. *

  14. */

  15. publicclass NetAnalisysManager {  

  16. privatestatic NetAnalisysManager manager = null;  

  17. privateint netScanSize = 10;  

  18. privateint netPortSize = 10;  

  19. publicstatic NetAnalisysManager getManager() {  

  20. if (manager == null)  

  21.            manager = new NetAnalisysManager();  

  22. return manager;  

  23.    }  

  24. publicvoid initThreadModel() {  

  25.        initNetScanThreadModel();  

  26.        initNetPortThreadModel();  

  27.    }  

  28. publicvoid initNetScanThreadModel() {  

  29. for (int i = 0; i < netScanSize; i++) {  

  30.            addNetScanThreadModel(i);  

  31.        }  

  32.        ThreadPoolManager.getManager().startThreadPool();  

  33.    }  

  34. publicvoid initNetPortThreadModel() {  

  35. for (int i = 0; i < netPortSize; i++) {  

  36.            addNetPortThreadModel(i);  

  37.        }  

  38.        ThreadPoolManager.getManager().startThreadPool();  

  39.    }  

  40. privatevoid addNetScanThreadModel(int i) {  

  41.        NetScanThreadModel threadModel = new NetScanThreadModel();  

  42.        threadModel.setThreadName("netScanThreadModel" + i);  

  43.        ThreadPoolManager.getManager().addThread(threadModel);  

  44.        threadModel = null;  

  45.    }  

  46. privatevoid addNetPortThreadModel(int i) {  

  47.        NetPortThreadModel threadModel = new NetPortThreadModel();  

  48.        threadModel.setThreadName("netPortThreadModel" + i);  

  49.        ThreadPoolManager.getManager().addThread(threadModel);  

  50.        threadModel = null;  

  51.    }  

  52. /**

  53.     * 开始执行网络扫描

  54.     *

  55.     * @param startIp

  56.     * @param endIp

  57.     * @param callback

  58.     * @param methodName

  59.     */

  60. publicvoid startNetScan(String startIp, String endIp,  

  61.            NetAnalyzeCallBack callback, String methodName) {  

  62.        List ipRangeList = NetWorkUtil.seperateIpRange(startIp,  

  63.                endIp, 2);  

  64. int index = 0;  

  65.        callback.setAnalyzeFinished(false);  

  66. long firstTime = System.currentTimeMillis();  

  67. while (index < ipRangeList.size()) {  

  68. // 获取空闲线程,如果线程繁忙则等待

  69.            SuperThread theThread = ThreadPoolManager.getManager()  

  70.                    .getIdleThread("netScanThreadModel");  

  71. if (theThread != null) {  

  72.                NetScanThreadModel netScanModel = (NetScanThreadModel) theThread  

  73.                        .getThreadModel();  

  74. if (netScanModel.getObject() == null) {  

  75.                    netScanModel.setObject(callback);  

  76.                }  

  77.                netScanModel.setMethodName(methodName);  

  78.                theThread.setValues(ipRangeList.get(index));  

  79.                index++;  

  80.            } else {  

  81. try {  

  82.                    Thread.sleep(500);  

  83.                } catch (InterruptedException e) {  

  84.                }  

  85.            }  

  86.        }  

  87. while (ThreadPoolManager.getManager().getIdleThreadSize(  

  88. "netScanThreadModel") != this.netScanSize) {  

  89. try {  

  90.                Thread.sleep(500);  

  91.            } catch (InterruptedException e) {  

  92.            }  

  93.        }  

  94.        callback.setAnalyzeFinished(true);  

  95. long passTime = System.currentTimeMillis() - firstTime;  

  96. // System.out.println("执行所需时间:" + passTime);

  97. // ThreadPoolManager.getManager().stopThreadPool();

  98.    }  

  99. /**

  100.     * 开始执行端口扫描

  101.     *

  102.     * @param ip

  103.     * @param minPort

  104.     * @param maxPort

  105.     * @param callback

  106.     * @param methodName

  107.     */

  108. publicvoid startNetPort(String ip, int minPort, int maxPort,  

  109.            NetAnalyzeCallBack callback, String methodName) {  

  110.        List ipPortList = NetWorkUtil.seperateIpPort(ip, minPort,  

  111.                maxPort);  

  112. int index = 0;  

  113.        callback.setAnalyzeFinished(false);  

  114. while (index < ipPortList.size()) {  

  115. // 获取空闲线程,如果线程繁忙则等待

  116.            SuperThread theThread = ThreadPoolManager.getManager()  

  117.                    .getIdleThread("netPortThreadModel");  

  118. if (theThread != null) {  

  119.                NetPortThreadModel netPortModel = (NetPortThreadModel) theThread  

  120.                        .getThreadModel();  

  121.                netPortModel.setObject(callback);  

  122.                netPortModel.setMethodName(methodName);  

  123.                theThread.setValues(ipPortList.get(index));  

  124.                index++;  

  125.            } else {  

  126. try {  

  127.                    Thread.sleep(1000);  

  128.                } catch (InterruptedException e) {  

  129.                }  

  130.            }  

  131.        }  

  132.        callback.setAnalyzeFinished(true);  

  133.    }  

  134. publicvoid stopNetScanThread() {  

  135.        ThreadPoolManager.getManager().stopThreadPool("netScanThreadModel");  

  136.    }  

  137. publicvoid stopNetPortThread() {  

  138.        ThreadPoolManager.getManager().stopThreadPool("netPortThreadModel");  

  139.    }  

  140. publicint getNetScanSize() {  

  141. return netScanSize;  

  142.    }  

  143. publicvoid setNetScanSize(int netScanSize) {  

  144. this.netScanSize = netScanSize;  

  145.    }  

  146. publicint getNetPortSize() {  

  147. return netPortSize;  

  148.    }  

  149. publicvoid setNetPortSize(int netPortSize) {  

  150. this.netPortSize = netPortSize;  

  151.    }  

  152. }  




  调用的例子,ip段扫描:


[java] view plain copy
  1. package com.shine.NetAnalisys;  

  2. import com.shine.NetAnalisys.model.NetPortCallBack;  

  3. import com.shine.NetAnalisys.model.NetScanCallBack;  

  4. publicclass Example {  

  5. publicstaticvoid main(String args[]) {  

  6.        NetAnalisysManager.getManager().setNetScanSize(10);  

  7.        NetAnalisysManager.getManager().initThreadModel();  

  8. long curTime = System.currentTimeMillis();  

  9.        NetScanCallBack callback = new NetScanCallBack();  

  10.        NetAnalisysManager.getManager().startNetScan("192.168.11.1", "192.168.11.255", callback, "callback");  

  11. for (String ip : callback.getIpList()) {  

  12.            System.out.println("接收IP" + ip + "可ping通");  

  13.        }  

  14.        System.out.println("执行时间" + (System.currentTimeMillis() - curTime));  

  15.    }  

  16. }  


 调用端口扫描的代码:



[java] view plain copy
  1. package com.shine.NetAnalisys;  

  2. import com.shine.NetAnalisys.model.NetPortCallBack;  

  3. import com.shine.NetAnalisys.model.NetScanCallBack;  

  4. publicclass Example {  

  5. publicstaticvoid main(String args[]) {  

  6.        NetAnalisysManager.getManager().setNetScanSize(10);  

  7.        NetAnalisysManager.getManager().initThreadModel();  

  8. long curTime = System.currentTimeMillis();  

  9.        NetScanCallBack callback = new NetScanCallBack();  

  10.        NetAnalisysManager.getManager().startNetScan("192.168.11.1", "192.168.11.255", callback, "callback");  

  11. for (String ip : callback.getIpList()) {  

  12.            System.out.println("接收IP" + ip + "可ping通");  

  13.        }  

  14.        System.out.println("执行时间" + (System.currentTimeMillis() - curTime));  

  15.    }  

  16. }  




下载的地址(jar含源代码):

    http://ken-javaframeword.googlecode.com/files/javaFramework2_5_2.jar

    svn地址:http://code.google.com/p/ken-javaframeword/

    全部代码请参照svn,上面代码只能导入jar包后执行