`

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;   
import java.util.Iterator;   
  
/**  
 * 使用java线程扫描局域网ip简单方案  
 * @author Administrator  
 *  
 */  
public class LanIP {   
       
    public static void main(String[] args) {   
        System.out.println("开始......");   
        LanIP ip = new LanIP();   
        ArrayList<String> list =  ip.getLanIPArrayList();   
        System.out.println("最后有多少个===>"+list.size());   
    }   
       
    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) {   
            System.out.println("IP===>"+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 {   
                System.out.println("getArrayIPUsed:  arrayIP.size===>"+arrayIP.size());   
                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);   
            System.out.println("stringIPHead===>"+stringIPHead);   
            String stringIP = null;   
            for (int i = firstIP; i <= lastIP; i++) {   
                stringIP = stringIPHead + i;   
                arrayIP.add(stringIP);   
            }   
            System.out.println("进放到这里...arrayIP的总个数:"+arrayIP.size());   
        }   
  
        public void run() {   
            synchronized (this) {   
                try {   
                    System.out.println("run()  arrayIP.size()===>"+arrayIP.size());   
                    System.out.println("run()  threadNumNow===>"+threadNumNow);   
                    System.out.println("arrayThread.size()"+arrayThread.size());   
                    while (arrayIP.size() > 0) {   
                        while (threadNumNow >= MAXTHREADNUM) {   
                            System.out.println("线程超出30,中止后面的...");   
                            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) {   
                System.out.println("InnerClass ip===>"+ip);   
                this.ip = ip;   
            }   
  
            private boolean isUsedIPAddress(String ip) {   
                System.out.println("isUsedIPAddress===>"+ip);   
                synchronized (this) {   
                    System.out.println("进入此地.....");   
                    // 判断这个 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();   
                        System.out.println("bufReadLineString===>"+bufReadLineString);   
                        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);   
                    }   
                }   
            }   
        }   
    }   
}   

利用IP地址获得局域网计算机的名字、mac地址、工作组

System.out.println("192.168.1.187对应网卡的MAC是:");

NetworkInterface ne=NetworkInterface.getByInetAddress(InetAddress.getByName("192.168.1.187"));

byte[]mac=ne.getHardwareAddress();

String mac_s=hexByte(mac[0])+":"+hexByte(mac[1])+":"+ hexByte(mac[2])+":"+hexByte(mac[3])+":"+ hexByte(mac[4])+":"+hexByte(mac[5]);System.out.println(mac_s);

程序运行结果: 192.168.1.187对应网卡的MAC是: 00:0c:f1:20:75:58 
 
分享到:
评论

相关推荐

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

    用了一个礼拜时间做了一个端口扫描程序 从扫描同一个网段的IP开始 逐步添加功能 现在还具有了扫描选定IP的常见TCP UDP端口 包括部分常见木马所使用端口 并可以自定义扫描端口 扫描同一网段的IP主要是用SHELL方法 ...

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

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

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

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

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

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

    JAVA局域网聊天(有文档)

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

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

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

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

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

    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局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

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

    Java局域网通信——飞鸽传书源代码 28个目标文件 内容索引:JAVA源码,媒体网络,飞鸽传书 Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java...

    java应用软件程序设计

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

    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 收发电子...

    FileTransfer:局域网文件传输 LAN FileTransfer

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

Global site tag (gtag.js) - Google Analytics