`

Java循环Ping局域网内IP

阅读更多

       在局域网中我们可以通过在cmd中利用ipconfig(windows)或者ifconfig(linux)查看本机局域网内IP,可以通过ping IP来测试你与另一个IP网络是否通畅,我们也可以通过for /l %p in (1,1,254) do @ping 192.168.0.%p -n 1 -w 20 |find "reply from" /i来帮我们ping局域网内IP。

       我们也可以通过java程序来帮助我们实现这个功能。(文章主要作为笔记,如有什么不对的地方请指正,谢谢)

方法(1)

public static boolean ping(String ipAddress) throws Exception {
        int  timeOut =  3000 ;  //超时应该在3秒以上
        boolean status = 
        InetAddress.getByName(ipAddress).isReachable(timeOut);     
        // 回值是true时,说明host是可用的,false则不可。   
        return status;
    }

    java.net.InetAddress类的使用可以参考http://www.cnblogs.com/hnrainll/archive/2012/01/09/2317515.html     

 

方法(2)

public static void ping2(String ipAddress) throws Exception {
        String line = null;
        try {
            Process pro = Runtime.getRuntime().exec("ping " + ipAddress);
            BufferedReader buf = new 
            BufferedReader(newInputStreamReader(pro.getInputStream()));
            //循环ping 该IP
            while ((line = buf.readLine()) != null)
                System.out.println(line);

        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

   java.lang.Process类的可以参考http://lavasoft.blog.51cto.com/62575/15599

 

 

方法(3)

public static boolean ping3(String ipAddress, int pingTimes, int timeOut) {
        BufferedReader in = null;
        Runtime r = Runtime.getRuntime(); 
        String pingCommand = "ping " + ipAddress + " -n " + pingTimes  
              + " -w " + timeOut;
        try {   // 执行命令并获取输出
            System.out.println(pingCommand);
            Process p = r.exec(pingCommand);
            if (p == null) {
                return false;
            }
            in = new BufferedReader(new 
            InputStreamReader(p.getInputStream()));   
            // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数
            int connectedCount = 0;
            String line = null;
            while ((line = in.readLine()) != null) {
                connectedCount += getCheckResult(line);
            }   
          // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真
            return connectedCount == pingTimes;
        } catch (Exception ex) {
            ex.printStackTrace();   // 出现异常则返回假
            return false;
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 java.lang.Runtime类的简介可以参考http://lavasoft.blog.51cto.com/62575/15565/

上面的三个都可以实现ping ip

我们在main函数中循环遍历IP

public static void main(String[] args) throws Exception {
        String ipAddress = "192.168.0.2";

        for(int i=1;i<255;i++){
            String IpAddress="192.168.0."+i;
           if(ping(IpAddress)){
               System.out.println(IpAddress);
            }else {
               System.out.print(i);
           }
        }
        //System.out.println(ping(ipAddress));
      //  ping2(ipAddress);
       // System.out.println(ping3(ipAddress, 5, 5000));
    }}

 

其中IP的最后一位大部分情况下是部位0和255的但是并非IP地址的最后一位永远不可以是255或0,这是有条件的。例如:当一个网段的掩码为255.255.255.0的时候,通常IP地址的最后一位不可以是255或0。因为这种掩码的网段,最后一位是0的IP是网段的网络地址,而最后一位是255的IP是网段的广播地址,不能分配给主机。假设一个网段为172.16.0.0,它的掩码是255.255.254.0,那么它的主机可用地址范围是172.16.0.1到172.16.1.254,即172.16.1.0和172.16.0.255这两个地址是可用的。

 

另外一点,当我们单纯的for循环ping的时候是非常浪费时间的,所以我们可以利用多线程来提高效率

package PingIPAdress;

import java.io.IOException;
import java.net.InetAddress;
public class PingIpaddressThreads implements Runnable{

    int startIpNum;
    int endIpNum;
    public PingIpaddressThreads(int startIpNum,int endIpNum){
        this.startIpNum=startIpNum;
        this.endIpNum=endIpNum;
    }
    @Override
    public void  run(){
        int outtime=300;
        boolean statu=false;

        for(int i=startIpNum;i<=endIpNum;i++) {
            String IPAddress = "192.168.0." + String.valueOf(i);
            try {
                statu = InetAddress.getByName(IPAddress).isReachable(outtime);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (statu) {
                System.out.println("");
                System.out.println(IPAddress);
            } else {
                //System.out.println(i);
            }
        }
    }
}

 

public class PingIpMain {
    public static void main(String[] args){
        int start;
        int end;
        long starttime=System.currentTimeMillis();
        for(int i=0;i<4;i++){

            start=i*51;
            end=(i+1)*51;
            if(start==0){
                start=1;
            }
            if(end==255){
                end=254;
            }
            Runnable runnable=new PingIpaddressThreads(start,end);
            Thread thread1=new Thread(runnable);
            thread1.start();
        }
        long endtime=System.currentTimeMillis();
        System.out.println("共用时"+(endtime-starttime)+"s");
    }
}

  这里的共用时是线程创建完到这里的时间,并不是线程执行完的时间。而线程执行时间的统计我们可以使用CountDownLatch,可以看看http://www.importnew.com/15731.html

 

public class PingIpMain {
    public static void main(String[] args) throws InterruptedException {
        int start;
        int end;
        long starttime=System.currentTimeMillis();
        Date date1=new Date();
        System.out.println(date1);
        CountDownLatch countDownLatch=new CountDownLatch(4);
        for(int i=0;i<4;i++){

            start=i*51;
            end=(i+1)*51;
            if(start==0){
                start=1;
            }
            if(end==255){
                end=254;
            }
            Runnable runnable=new PingIpaddressThreads(start,end,countDownLatch);
            Thread thread1=new Thread(runnable);
            thread1.start();
        }

        countDownLatch.await();
        long endtime=System.currentTimeMillis();
        Date date2=new Date();
        System.out.println(date2);
        System.out.println("共用时"+(endtime-starttime)/1000+"s");
    }
}
 
public class PingIpaddressThreads implements Runnable{

    int startIpNum;
    int endIpNum;
    CountDownLatch countDownLatch;
    public PingIpaddressThreads(int startIpNum, int endIpNum, CountDownLatch countDownLatch){
        this.startIpNum=startIpNum;
        this.endIpNum=endIpNum;
        this.countDownLatch=countDownLatch;
    }
    @Override
    public void  run(){
        int outtime=300;
        boolean statu=false;

        for(int i=startIpNum;i<=endIpNum;i++) {
            String IPAddress = "192.168.0." + String.valueOf(i);
            try {
                statu = InetAddress.getByName(IPAddress).isReachable(outtime);
            } catch (IOException e) {
                e.printStackTrace();
            }finally {

            }
            if (statu) {
                System.out.println("");
                System.out.println(IPAddress);
            } else {
                //System.out.println(i);
            }
        }
        countDownLatch.countDown();
    }
}
 

 

分享到:
评论

相关推荐

    Ping局域网内所有IP

    要ping整个局域网内的所有IP,我们可以编写一个批处理脚本(如PingIP.bat),利用循环遍历指定IP段的所有可能地址。例如,对于192.168.1.0/24子网(即255.255.255.0的子网掩码),我们可以从192.168.1.1 ping到192....

    java中ping命令ping工具类(循环ping)

    java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ...

    ping局域网连续IP

    在这个场景中,"ping局域网连续IP"指的是通过批量ping局域网内连续的IP地址,来检测网络中的设备是否在线或者网络连接是否正常。这对于系统管理员或网络技术人员来说,是一种快速排查网络故障、了解网络设备状态的...

    ping局域网内可用ip

    ping局域网内有哪些ip被占用,哪些可用,统计用户数量

    C++获取所有局域网可用IP(ping)

    在C++编程中,获取局域网内所有可用的IP地址通常是为了进行网络通信或设备发现等任务。这里我们主要探讨如何使用C++通过ping命令来实现这一目标。ping是一种网络诊断工具,它通过发送ICMP回显请求报文到目标IP地址,...

    快速PING局域网IP的批处理

    快速PING局域网IP的批处理 检查全网段IP在线情况,可在1分内完成并有详细报告。

    局域网内空闲IP的查询 批处理实现

    总结来说,局域网内空闲IP的查询批处理实现是通过编写批处理脚本,结合Windows系统自带的命令行工具,如ping和find等,自动扫描网络中的IP地址,找出未被占用的IP。这种方法在需要动态分配IP地址或者排查网络问题时...

    局域网IP PING测试工具

    1.需运行在64位操作系统(直接上传exe有问题,放压缩文件中重新上传) 2.局域网IP PING测试工具,方便快速查询已使用,未使用的IP地址 3.例如输入192.168.168.10, 则从192.168.168.10开始,一直检测到192.168.168.254

    C#获取局域网内所有计算机的IP地址和MAC地址

    C#实现获取局域网内所有计算机的IP地址和MAC地址的控制台应用程序源码 程序启动时首先获取本机的IP和MAC地址; 然后获取局域网内所有计算机的IP地址; 输入IP地址回车,获取该IP的MAC地址; 输入“STARTSCAN”回车...

    BAT批处理小程序:循环扫描局域网未占用IP地址!

    本话题聚焦于一个名为"BAT批处理小程序:循环扫描局域网未占用IP地址!"的实用案例,我们将详细探讨如何利用批处理脚本来实现这个功能。 首先,我们要理解局域网(LAN,Local Area Network)是由多台设备通过网络连接...

    C++获取所有局域网可用IP ping源码

    在C++编程中,获取局域网内所有可用的IP并进行ping操作是网络编程中的一个常见需求。这个任务涉及到网络接口的枚举、IP地址的解析以及ping命令的实现。下面将详细介绍如何通过C++来实现这个功能。 首先,我们需要...

    查看局域网在线的ip(基于QT语言实现)源码

    在这个项目中,开发者可能创建了一个自定义的类或函数,利用QNetworkAccessManager向局域网内的每个可能的IP地址发送ping请求,并根据响应来判断设备是否在线。 代码实现中,首先需要定义一个IP地址范围,通常是...

    C# 局域网IP扫描 实例源码(网络操作)

    - 使用异步循环遍历指定IP范围,对每个IP执行ping操作。 - 捕获并处理可能出现的异常。 - 将结果存储在一个数据结构中,如列表或字典。 - 最后,将结果输出到控制台或UI界面上。 总的来说,C#局域网IP扫描实例源码...

    java扫描局域网活动主机

    这个程序可能是一个小型的Java应用,利用了多线程技术和线程池来提高扫描速度,确保在短时间内高效地完成对局域网内设备的探测。 线程池是Java并发编程中的一个重要概念,它通过维护一组可重用的预先创建的线程来...

    Ping网段内多个IP.bat

    自动Ping一个网段内从0~255的所有IP地址,并写入“不通.txt"文件中,方便查找一个网段内的IP使用情况。

    shell脚本 ping所有网段ip

    shell脚本 ping所有网段ip 当局域网内,网络设备ip不知,可以用此脚本ping可以更改[ping指定网段ip 1s一个ip是否通畅

    C#实现搜索局域网内网络设备IP功能

    在C#编程环境中,搜索局域网内的网络设备IP功能是一项常见的需求,尤其在系统集成、网络管理和自动化脚本编写中。本篇文章将详细介绍如何利用C#语言来实现这一功能,以及涉及的相关知识点。 首先,要实现这个功能,...

    ping局域网内主机是否在线

    标题中的"ping局域网内主机是否在线"指的是使用网络诊断工具"Ping"来检查局域网中的另一台计算机是否可以通信。Ping是基于Internet控制消息协议(ICMP)的一个应用,它允许用户向网络上的其他设备发送一个数据包,并...

    局域网IP扫描工具 扫描局域网内的所有电脑的IP 和MAC

    局域网IP扫描工具是一种实用程序,专门设计用于在本地网络(即局域网)内发现和识别所有连接设备的IP地址和MAC地址。在现代网络环境中,了解局域网内的设备信息对于网络安全、设备管理以及故障排查至关重要。IP...

    简单的查看局域网内可用的ip

    2. **遍历IP地址**:使用循环遍历子网内的所有IP地址,依次执行`ping`命令。 3. **记录活跃IP**:对于回应`ping`请求的IP,将其记录下来,作为局域网内可用的IP地址。 4. **显示结果**:最后,将找到的活跃IP列表...

Global site tag (gtag.js) - Google Analytics