`
huzhenyu
  • 浏览: 185284 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

使用java线程扫描局域网ip简单方案

    博客分类:
  • JAVA
阅读更多
from: http://wooden-baby.iteye.com/blog/351912
使用java线程扫描局域网ip简单方案

java 快速扫描局域网 ip 之二级嵌套类

方案一 :

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.InetAddress;

import java.net.UnknownHostException;

import java.util.ArrayList;



public class LanIP {

       public ArrayList<String> getLanIPArrayList() {

              ArrayList<String> arrayIP = null;

              try {

                     InitSystem initSystem = null;

                     initSystem = new InitSystem();

                     Thread thread = new Thread(initSystem);

                     thread.start();

                     thread.join();

                     arrayIP = initSystem.getArrayIPUsed();

              } catch (UnknownHostException e) {

                     e.printStackTrace();

              } catch (InterruptedException e) {

                     e.printStackTrace();

              }

              return arrayIP;

       }



       private class InitSystem implements Runnable {

              private int firstIP = 2;// 查询的 IP 地址的最后一位起始点

              private int lastIP = 255;// 查询的 IP 地址的最后一位结束点

              private volatile ArrayList<Thread> arrayThread;// 子线程段

              private final int MAXTHREADNUM = 30; // 最大同时进行的子线程数量

              private int threadNumNow;// 当前正在进行的子线程数量

              private volatile ArrayList<String> arrayIP;// 局域网查询所有可能的 IP 地址的结果集

              private volatile ArrayList<String> arrayIPUsed;// 局域网查询已经使用的 IP 地址的结果集



              private InitSystem(String ip) {

                     arrayIP = new ArrayList<String>();

                     arrayIPUsed = new ArrayList<String>();

                     arrayThread = new ArrayList<Thread>();

                     setIPAddressList(ip);

              }



              private InitSystem() throws UnknownHostException {

                     this(InetAddress.getLocalHost().getHostAddress());

              }



              private synchronized ArrayList<String> getArrayIPUsed() {

                     try {

                            while (arrayIP.size() > 0) {

                                   Thread.sleep(300);

                            }

                     } catch (InterruptedException e) {

                            e.printStackTrace();

                     }

                     return arrayIPUsed;

              }



              private void setIPAddressList(String ip) {

                     // 根据这个 ip 地址查询它所在的局域网的所有可能 IP 地址的集合

                     int lastPointIndex = ip.lastIndexOf('.');

                     String stringIPHead = ip.substring(0, ++lastPointIndex);

                     String stringIP = null;

                     for (int i = firstIP; i <= lastIP; i++) {

                            stringIP = stringIPHead + i;

                            arrayIP.add(stringIP);

                     }

              }



              public void run() {

                     synchronized (this) {

                            try {

                                   while (arrayIP.size() > 0) {

                                          while (threadNumNow >= MAXTHREADNUM) {

                                                 for (Thread thread : arrayThread) {

                                                        if (!thread.getState().equals(

                                                                      Thread.State.TERMINATED)) {

                                                               thread.join(5);

                                                        }

                                                        --threadNumNow;

                                                 }

                                                 arrayThread = new ArrayList<Thread>();

                                          }

                                          Thread thread = new Thread(new InnerClass(arrayIP

                                                        .remove(0)));

                                          thread.start();

                                          threadNumNow++;

                                          arrayThread.add(thread);

                                   }

                            } catch (Exception e) {

                                   e.printStackTrace();

                            }

                     }

              }



              private class InnerClass implements Runnable {

                     // 线程查询一个 IP 是否是可以连接的 是则加入到相应的 IP 数组

                     private String ip;



                     private InnerClass(String ip) {

                            this.ip = ip;

                     }



                     private boolean isUsedIPAddress(String ip) {

                            synchronized (this) {

                                   // 判断这个 IP 地址在当前局域网中是否是可连接的 IP

                                   Process process = null;

                                   BufferedReader bufReader = null;

                                   String bufReadLineString = null;

                                   try {

                                          process = Runtime.getRuntime().exec(

                                                        "ping " + ip + " -w 100 -n 1");

                                          bufReader = new BufferedReader(new InputStreamReader(

                                                        process.getInputStream()));

                                          for (int i = 0; i < 6 && bufReader != null; i++) {

                                                 bufReader.readLine();

                                          }

                                          bufReadLineString = bufReader.readLine();

                                          if (bufReadLineString == null) {

                                                 process.destroy();

                                                 return false;

                                          }

                                          if (bufReadLineString.indexOf("timed out") > 0

                                                        || bufReadLineString.length() < 17

                                                        || bufReadLineString.indexOf("invalid") > 0) {

                                                 process.destroy();

                                                 return false;

                                          }

                                   } catch (IOException e) {

                                          e.printStackTrace();

                                   }

                                   process.destroy();

                                   return true;

                            }

                     }



                     public void run() {

                            synchronized (this) {

                                   if (isUsedIPAddress(ip)) {

                                          arrayIPUsed.add(ip);

                                   }

                            }

                     }

              }

       }

}

方案二 :

方案二与方案一只有一点是不一样的,就是在与下面这个相关的代码,采用的是队列而不是数组

将 private volatile ArrayList<Thread> arrayThread;// 子线程段

改为: private volatile ArrayBlockingQueue<Thread> queueThread;// 子线程队列

当然,其他相关的地方的处理也要做些修改.

注!!!!

在 linux下运行发现InetAddress.getLocalHost().getHostAddress();的返回值是127.0.0.1,这个与 windows下的返回值不一样。由于jdk在win和linux下这个方法的差异,这个程序在linux下不能如预期的那样工作,需要做一些技术上的改进。
分享到:
评论

相关推荐

    JAVA SWING 多线程实现扫描同一个网段的IP,以及选定IP的端口

    从扫描同一个网段的IP开始 逐步添加功能 现在还具有了扫描选定IP的常见TCP UDP端口 包括部分常见木马所使用端口 并可以自定义扫描端口 扫描同一网段的IP主要是用SHELL方法 使用PING命令并判断返回值内容 从而确定...

    JAVA SWING 多线程扫描局域网IP及端口 v2 源码

    鉴于有网友需要源码,特此上传 简单的添加了一些注释,如有问题请联系

    JAVA SWING 多线程扫描局域网IP及端口 shellping v2

    描选定IP的常见TCP UDP端口 包括部分常见木马所使用端口 并可以自定义扫描端口 扫描同一网段的IP主要是用SHELL方法 使用PING命令并判断返回值内容 从而确定服务器是否打开 扫描端口的原理是使用socket类判断是否...

    局域网IP扫描器,支持多线程

    使用于局域网的ip扫描器,功能简单,提供多线程扫描,可自定义线程的数量.....

    基于JAVA局域网监听软件的设计与开发的毕业设计,,包括主机名称、IP地址、操作系统、CPU使用率、内存使用率等信息

    本设计主要针对局域网内的主机进行监控管理,通过JAVA语言开发的监控软件,可以实时监控局域网内的主机状态,包括主机名称、IP地址、操作系统、CPU使用率、内存使用率等信息。 设计了主机信息管理模块、主机状态监控...

    JAVA局域网聊天(有文档)

    多线程扫描IP段,可以控制线程数量。简单实现了聊天功能

    [网络安全课设]基于JAVA的系统端口扫描软件设计实现(java代码+IDEA+UI图形界面+实验报告)

    参照superscan、nmap等端口扫描软件的运行情况,自行设计一个简单的端口扫描软件,...(4)友好地图形用户界面,扫描过程中能显示扫描进度,扫描时间,异常告警窗口(如IP地址范围出界等),在局域网段实现。 欢迎使用

    java源码包---java 源码 大量 实例

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    JAVA上百实例源码以及开源项目源代码

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    JAVA上百实例源码以及开源项目

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    java源码包4

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...

    java源码包3

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...

    java源码包2

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...

    h_JAVA 2应用编程150例.rar

    实例46 UDP与TCP/IP的简单应用 129 实例47 聊天室 131 实例48 浏览FTP 136 实例49 局域网广播 147 实例50 建立HTTP连接 151 实例51 迷你浏览器 152 实例52 扫描应用端口 154 实例53 监控HTTP 155 实例54 收发电子...

    java应用软件程序设计

    126 实例46 UDP与TCP/IP的简单应用 129 实例47 聊天室 131 实例48 浏览FTP 136 实例49 局域网广播 147 实例50 建立HTTP连接 151 实例51 迷你浏览器 152 实例52 扫描应用端口 154 实例53 ...

    FileTransfer:局域网文件传输 LAN FileTransfer

    1.0版本 ...2.尝试改动buff[]的大小能否加快传输速度 3.将接收界面的文件名限定长度 4.activity_main中,发送和接收字样模糊 5.接收完文件后,按钮不...5.新增多线程传输一个文件的功能 6.显示下载速度 7.改用多端口监听

Global site tag (gtag.js) - Google Analytics