在网管的设计中,经常要对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包后执行

高性能的java的ip资源扫描和端口分析相关推荐

  1. Java 局域网IP地址扫描

    Java扫描局域网地址主要通过CMD命令,主要通过Runtime和Process类,由于同一局域网下的IP地址比较多需要通过Java的多线程来扫描端口. import java.io.Buffered ...

  2. java udp ip端口 设置_UDP端口扫描Java只找到1个开放的UDP端口

    我对端口扫描有一个分歧.我在 Java中扫描一些IP地址的UDP端口.在我的程序中(假设一切正常)我只能找到一个开放的UDP端口.在另一方面端口扫描"nmap"我得到4个开放的UD ...

  3. Java TCP/IP Socket 编程 笔记

    http://jimmee.iteye.com/blog/617110 http://jimmee.iteye.com/category/93740 Java TCP/IP Socket 编程 笔记( ...

  4. java通过ip地址获取相应对应的城市

    发现了一比较好的本地ip对应地址的库资源文件--做一下笔记. 官方网站 https://dev.maxmind.com/geoip/geoip2/geolite2/ 这里提供了免费的库文件,还有很好的 ...

  5. 秒杀springboot——未来轻量级高性能的Java云原生微服务框架来啦

    秒杀springboot--未来轻量级高性能的Java云原生微服务框架来啦 引子 自2003年Rod.Juergen 和 Yann开发并发布Spring项目后,J2EE 迎来了新的开始.在 2013 ...

  6. 使用什么协议扫描服务器端口,通过ip地址扫描服务器端口号

    通过ip地址扫描服务器端口号 内容精选 换一换 OBS Browser+是一款用于访问和管理对象存储服务的图形化工具,支持通过配置内网DNS服务器地址的方式,使在华为云上的Windows ECS通过内 ...

  7. java转换ip地址格式转换_Java编程IP地址和数字相互转换代码示例

    最近才知道,将ip地址转换成十进制.八进制.十六进制同样可以访问网站. IP转为数字(第二种算法.用左移.按位或实现.效率更高.): public long ipToLong(String ipAdd ...

  8. 【PC工具】更新简单好用绿色IP地址扫描工具,内部网络设备查看工具,内网ip查询ip扫描工具,电脑IP地址查看方法...

    玩路由器.NAS和树莓派的朋友经常需要查看内网设备ip地址.尤其是树莓派,一般情况不用桌面系统,登录SSH时候经常需要知道树莓派的ip地址.登录路由器可以查看到局域网内设备的ip地址,但很多情况下不方 ...

  9. apache代理时java获取IP的问题

    2019独角兽企业重金招聘Python工程师标准>>> x-forwarded-for的深度挖掘 如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的 ...

  10. Java官方相关资源文件的获取教程

    Java官方相关资源文件的获取教程 说明 类库源文件的获取 JDK文档的下载 阅读联机API文档 Java语言和虚拟机规范:Java Language and Virtual Machine Spec ...

最新文章

  1. 学金融买计算机配置,我是学金融投资的计算机等级考试哪个方向对我工作有用...
  2. python 解决IndentationError: unexpected unindent的报错!和通用代码框架,import requests def getHTMLText(url)...的解释
  3. oracle存储过程生成单号,Oracle生成单据编号存储过程的实例代码
  4. 从单体式架构迁移到微服务架构,妈妈再也不用担心我找工作了!
  5. 「猜题第一篇」2019年大学生电子设计竞赛
  6. 万年历升级版 Calendar
  7. 2007年7月23日旅游
  8. SQL常用语句(面试必备)
  9. 利用anaconda 下载python所依赖的文件包
  10. 面向接口编程思想(的好处)
  11. linux命令看进程的tcp链接,Linux下查看TCP连接的状态的shell命令
  12. 【全局盘点】华为云政企全栈技术创新能力图谱
  13. 云计算厂商怎么打造自己的生态网络
  14. isis 网络 level 2 iih_ngspice实例介绍2--直流扫描分析
  15. 机器学习中数据预处理——标准化/归一化方法(scaler)
  16. Blender图解教程:设置参考图
  17. mac之强制退出程序方法
  18. 无人驾驶汽车的相关技术,无人驾驶相关技术知识
  19. Razor 一知半解
  20. 重庆已建成4.2万余个5G基站;山西省累计建成5G基站1.2万个

热门文章

  1. 人工智能笔记11 --强化学习
  2. wifi mouse hd for linux,wifi mouse hd客户端PC版下载_wifi mouse hd客户端PC版官方下载-太平洋下载中心...
  3. C语言求素数/质数最高效的方法
  4. 算法学习——K近邻算法
  5. 迈普交换机中断计算机网络,迈普3100交换机配置命令大全
  6. 小米便签源码分析——data包
  7. U盘 / 移动硬盘在 Mac 苹果电脑上无法使用问题
  8. (转)最大流最小割定理
  9. 单代号网络图计算例题_一表多图(表格/横道图/网络图)让计划编制效率提高10倍...
  10. python数据清洗入门教程(完整版)