在局域网中我们可以通过在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,我们可以编写一个批处理脚本(如PingIP.bat),利用循环遍历指定IP段的所有可能地址。例如,对于192.168.1.0/24子网(即255.255.255.0的子网掩码),我们可以从192.168.1.1 ping到192....
java中ping命令ping工具类(循环ping) java ping ip ping命令 ping工具类 支持linux和windows等所有平台 Ping是Windows下的一个命令 在Unix和Linux下也有这个命令。 ping也属于一个通信协议,是TCP/IP协议的一部分 ...
在这个场景中,"ping局域网连续IP"指的是通过批量ping局域网内连续的IP地址,来检测网络中的设备是否在线或者网络连接是否正常。这对于系统管理员或网络技术人员来说,是一种快速排查网络故障、了解网络设备状态的...
ping局域网内有哪些ip被占用,哪些可用,统计用户数量
在C++编程中,获取局域网内所有可用的IP地址通常是为了进行网络通信或设备发现等任务。这里我们主要探讨如何使用C++通过ping命令来实现这一目标。ping是一种网络诊断工具,它通过发送ICMP回显请求报文到目标IP地址,...
快速PING局域网IP的批处理 检查全网段IP在线情况,可在1分内完成并有详细报告。
总结来说,局域网内空闲IP的查询批处理实现是通过编写批处理脚本,结合Windows系统自带的命令行工具,如ping和find等,自动扫描网络中的IP地址,找出未被占用的IP。这种方法在需要动态分配IP地址或者排查网络问题时...
1.需运行在64位操作系统(直接上传exe有问题,放压缩文件中重新上传) 2.局域网IP PING测试工具,方便快速查询已使用,未使用的IP地址 3.例如输入192.168.168.10, 则从192.168.168.10开始,一直检测到192.168.168.254
C#实现获取局域网内所有计算机的IP地址和MAC地址的控制台应用程序源码 程序启动时首先获取本机的IP和MAC地址; 然后获取局域网内所有计算机的IP地址; 输入IP地址回车,获取该IP的MAC地址; 输入“STARTSCAN”回车...
本话题聚焦于一个名为"BAT批处理小程序:循环扫描局域网未占用IP地址!"的实用案例,我们将详细探讨如何利用批处理脚本来实现这个功能。 首先,我们要理解局域网(LAN,Local Area Network)是由多台设备通过网络连接...
在C++编程中,获取局域网内所有可用的IP并进行ping操作是网络编程中的一个常见需求。这个任务涉及到网络接口的枚举、IP地址的解析以及ping命令的实现。下面将详细介绍如何通过C++来实现这个功能。 首先,我们需要...
在这个项目中,开发者可能创建了一个自定义的类或函数,利用QNetworkAccessManager向局域网内的每个可能的IP地址发送ping请求,并根据响应来判断设备是否在线。 代码实现中,首先需要定义一个IP地址范围,通常是...
- 使用异步循环遍历指定IP范围,对每个IP执行ping操作。 - 捕获并处理可能出现的异常。 - 将结果存储在一个数据结构中,如列表或字典。 - 最后,将结果输出到控制台或UI界面上。 总的来说,C#局域网IP扫描实例源码...
这个程序可能是一个小型的Java应用,利用了多线程技术和线程池来提高扫描速度,确保在短时间内高效地完成对局域网内设备的探测。 线程池是Java并发编程中的一个重要概念,它通过维护一组可重用的预先创建的线程来...
自动Ping一个网段内从0~255的所有IP地址,并写入“不通.txt"文件中,方便查找一个网段内的IP使用情况。
shell脚本 ping所有网段ip 当局域网内,网络设备ip不知,可以用此脚本ping可以更改[ping指定网段ip 1s一个ip是否通畅
在C#编程环境中,搜索局域网内的网络设备IP功能是一项常见的需求,尤其在系统集成、网络管理和自动化脚本编写中。本篇文章将详细介绍如何利用C#语言来实现这一功能,以及涉及的相关知识点。 首先,要实现这个功能,...
标题中的"ping局域网内主机是否在线"指的是使用网络诊断工具"Ping"来检查局域网中的另一台计算机是否可以通信。Ping是基于Internet控制消息协议(ICMP)的一个应用,它允许用户向网络上的其他设备发送一个数据包,并...
局域网IP扫描工具是一种实用程序,专门设计用于在本地网络(即局域网)内发现和识别所有连接设备的IP地址和MAC地址。在现代网络环境中,了解局域网内的设备信息对于网络安全、设备管理以及故障排查至关重要。IP...
2. **遍历IP地址**:使用循环遍历子网内的所有IP地址,依次执行`ping`命令。 3. **记录活跃IP**:对于回应`ping`请求的IP,将其记录下来,作为局域网内可用的IP地址。 4. **显示结果**:最后,将找到的活跃IP列表...