现在的位置: 首页 > 综合 > 正文

高性能的java的ip资源扫描和端口分析

2013年08月31日 ⁄ 综合 ⁄ 共 5370字 ⁄ 字号 评论关闭

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

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

      核心的分析类的源代码:

package com.shine.NetAnalisys;

import java.util.List;

import com.shine.NetAnalisys.model.NetAnalyzeCallBack;
import com.shine.NetAnalisys.threadModel.NetPortThreadModel;
import com.shine.NetAnalisys.threadModel.NetScanThreadModel;
import com.shine.NetAnalisys.util.NetWorkUtil;
import com.shine.framework.ThreadPoolUtil.ThreadPoolManager;
import com.shine.framework.ThreadPoolUtil.util.SuperThread;

/**
 * 网络分析类库 主要包括ip扫描,端口分析
 * 
 * @author viruscodecn@gmail.com
 * 
 */
public class NetAnalisysManager {
	private static NetAnalisysManager manager = null;

	private int netScanSize = 10;

	private int netPortSize = 10;

	public static NetAnalisysManager getManager() {
		if (manager == null)
			manager = new NetAnalisysManager();
		return manager;
	}

	public void initThreadModel() {
		initNetScanThreadModel();
		initNetPortThreadModel();
	}

	public void initNetScanThreadModel() {
		for (int i = 0; i < netScanSize; i++) {
			addNetScanThreadModel(i);
		}
		ThreadPoolManager.getManager().startThreadPool();
	}

	public void initNetPortThreadModel() {
		for (int i = 0; i < netPortSize; i++) {
			addNetPortThreadModel(i);
		}
		ThreadPoolManager.getManager().startThreadPool();
	}

	private void addNetScanThreadModel(int i) {
		NetScanThreadModel threadModel = new NetScanThreadModel();
		threadModel.setThreadName("netScanThreadModel" + i);
		ThreadPoolManager.getManager().addThread(threadModel);
		threadModel = null;
	}

	private void addNetPortThreadModel(int i) {
		NetPortThreadModel threadModel = new NetPortThreadModel();
		threadModel.setThreadName("netPortThreadModel" + i);
		ThreadPoolManager.getManager().addThread(threadModel);
		threadModel = null;
	}

	/**
	 * 开始执行网络扫描
	 * 
	 * @param startIp
	 * @param endIp
	 * @param callback
	 * @param methodName
	 */
	public void startNetScan(String startIp, String endIp,
			NetAnalyzeCallBack callback, String methodName) {
		List<String[]> ipRangeList = NetWorkUtil.seperateIpRange(startIp,
				endIp, 2);
		int index = 0;
		callback.setAnalyzeFinished(false);
		long firstTime = System.currentTimeMillis();
		while (index < ipRangeList.size()) {
			// 获取空闲线程,如果线程繁忙则等待
			SuperThread theThread = ThreadPoolManager.getManager()
					.getIdleThread("netScanThreadModel");
			if (theThread != null) {
				NetScanThreadModel netScanModel = (NetScanThreadModel) theThread
						.getThreadModel();
				if (netScanModel.getObject() == null) {
					netScanModel.setObject(callback);
				}
				netScanModel.setMethodName(methodName);
				theThread.setValues(ipRangeList.get(index));
				index++;
			} else {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
				}
			}
		}
		while (ThreadPoolManager.getManager().getIdleThreadSize(
				"netScanThreadModel") != this.netScanSize) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
			}
		}
		callback.setAnalyzeFinished(true);
		long passTime = System.currentTimeMillis() - firstTime;
		// System.out.println("执行所需时间:" + passTime);
		// ThreadPoolManager.getManager().stopThreadPool();
	}

	/**
	 * 开始执行端口扫描
	 * 
	 * @param ip
	 * @param minPort
	 * @param maxPort
	 * @param callback
	 * @param methodName
	 */
	public void startNetPort(String ip, int minPort, int maxPort,
			NetAnalyzeCallBack callback, String methodName) {
		List<String[]> ipPortList = NetWorkUtil.seperateIpPort(ip, minPort,
				maxPort);
		int index = 0;
		callback.setAnalyzeFinished(false);
		while (index < ipPortList.size()) {
			// 获取空闲线程,如果线程繁忙则等待
			SuperThread theThread = ThreadPoolManager.getManager()
					.getIdleThread("netPortThreadModel");
			if (theThread != null) {
				NetPortThreadModel netPortModel = (NetPortThreadModel) theThread
						.getThreadModel();
				netPortModel.setObject(callback);
				netPortModel.setMethodName(methodName);
				theThread.setValues(ipPortList.get(index));
				index++;
			} else {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
				}
			}
		}
		callback.setAnalyzeFinished(true);
	}

	public void stopNetScanThread() {
		ThreadPoolManager.getManager().stopThreadPool("netScanThreadModel");
	}

	public void stopNetPortThread() {
		ThreadPoolManager.getManager().stopThreadPool("netPortThreadModel");
	}

	public int getNetScanSize() {
		return netScanSize;
	}

	public void setNetScanSize(int netScanSize) {
		this.netScanSize = netScanSize;
	}

	public int getNetPortSize() {
		return netPortSize;
	}

	public void setNetPortSize(int netPortSize) {
		this.netPortSize = netPortSize;
	}
}

   调用的例子,ip段扫描:

package com.shine.NetAnalisys;

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

public class Example {
	public static void main(String args[]) {
		NetAnalisysManager.getManager().setNetScanSize(10);
		NetAnalisysManager.getManager().initThreadModel();
		
		long curTime = System.currentTimeMillis();
		NetScanCallBack callback = new NetScanCallBack();
		NetAnalisysManager.getManager().startNetScan("192.168.11.1", "192.168.11.255", callback, "callback");
		for (String ip : callback.getIpList()) {
			System.out.println("接收IP" + ip + "可ping通");
		}
		System.out.println("执行时间" + (System.currentTimeMillis() - curTime));
	}
}

  调用端口扫描的代码:

package com.shine.NetAnalisys;

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

public class Example {
	public static void main(String args[]) {
		NetAnalisysManager.getManager().setNetScanSize(10);
		NetAnalisysManager.getManager().initThreadModel();
		
		long curTime = System.currentTimeMillis();
		NetScanCallBack callback = new NetScanCallBack();
		NetAnalisysManager.getManager().startNetScan("192.168.11.1", "192.168.11.255", callback, "callback");
		for (String ip : callback.getIpList()) {
			System.out.println("接收IP" + ip + "可ping通");
		}
		System.out.println("执行时间" + (System.currentTimeMillis() - curTime));
	}
}

     

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

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

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

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

抱歉!评论已关闭.