为了提高效率,使用多线程方式同时ping。 但是如果开启255个线程,又会因为网络端口太拥挤,会被判定为无法ping通。
所以本例使用java自带线程池,线程池的连接数还不能太大,启动了15个线程。

等待所有的线程结束后打印出ping通了的ip地址。

package AtomicInteger;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class TestSocket {

public static void main(String[] args) throws IOException, InterruptedException {
InetAddress host = InetAddress.getLocalHost();
String ip = host.getHostAddress();
String ipRange = ip.substring(0, ip.lastIndexOf('.'));
System.out.println("本机ip地址:" + ip);
System.out.println("网段是: " + ipRange);

final List<Object> ips = Collections.synchronizedList(new ArrayList<>());
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 15, 60, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
final AtomicInteger number = new AtomicInteger();
for (int i = 0; i < 255; i++) {
final String testIP = ipRange + "." + (i + 1);
threadPool.execute(new Runnable() {
@Override
public void run() {
boolean reachable = isReachable(testIP);
if (reachable)
// System.out.println("找到可连接的ip地址:" + testIP);
ips.add(testIP);

synchronized (number) {
System.out.println("已经完成:" + number.incrementAndGet() + " 个 ip 测试");
}
}

});

}

// 等待所有线程结束的时候,就关闭线程池
threadPool.shutdown();
//等待线程池关闭,但是最多等待1个小时
if (threadPool.awaitTermination(1, TimeUnit.HOURS)) {
System.out.println("如下ip地址可以连接");
for (Object theip : ips) {
System.out.println(theip);
}
System.out.println("总共有:" + ips.size() + " 个地址");

}
}

private static boolean isReachable(String ip) {
try {
boolean reachable = false;

Process p = Runtime.getRuntime().exec("ping -n 1 " + ip);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
if (line.length() != 0)
sb.append(line + "\r\n");
}

//当有TTL出现的时候,就表示连通了
reachable = sb.toString().contains("TTL");
br.close();
return reachable;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}

}

判断本网段有多少可用的ip地址的更多相关文章

  1. 使用nmap工具查询局域网某个网段正在使用的ip地址

    linux下nmap工具可扫描局域网正在使用的ip地址 查询局域网某网段正在使用的ip地址: nmap -sP .* 以上命令,将打印10.10.70.*/24网络所有正在使用的ip地址

  2. python实现判断一个字符串是否是合法IP地址

    #!usr/bin/env python #encoding:utf-8 ''''' __Author__:沂水寒城 功能:判断一个字符串是否是合法IP地址 ''' import re def jud ...

  3. 在shell中如何判断字符串是否为有效的IP地址【转】

    转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...

  4. 判断一个字符串是否是合法IP地址

    # -*- coding: utf-8 -*- """ @File:test06_判断ip地址是否合法.py @E-mail:364942727@qq.com @Time ...

  5. 判断一个字符串是不是一个合法的IP地址

    最近在笔试的时候遇到碰一道算法题, 要求判断一个字符串是不是合法的ip地址. 将我的思路发出来分享一下,不一定正确,也不一定是最优的方法.希望能分享一些交流 要求用java或者c来实现,我的java代 ...

  6. 检测局域网中还可用的ip地址

    #!/bin/bash ` do { .$i &>/dev/null ];then echo "192.168.1.$i is not used" fi } done

  7. 判断一个字符串是否为有效ip地址

    bool f (const char *s) { int s1,s2,s3,s4; ) { return false; } if ((s1 & 0xffffff00) || (s2 & ...

  8. Window_Bat_Scripts—检测特定网段未使用的IP地址

    1.1    脚本名称 Check_IP_Not_Use.bat 1.2    脚本代码 @Echo off set /p input_number=请输入网络位(192.168.1.): IF EX ...

  9. (转帖) 为Docker容器指定自定义网段的固定IP/静态IP地址

    作者:雨水,日期:2016-04-09  CSDN博客: http://blog.csdn.net/gobitan 摘要:Docker容器运行的时候默认会自动分配一个默认网桥所在网段的IP地址.但很多 ...

随机推荐

  1. Mac下安装SQLmap的安装

    1.cd /usr/bin/ 2.sudo git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev3.重新打开terminal ...

  2. HP DL388 Gen9 Raid P440ar 工具

    HP DL388 Gen9 服务器raid升级P440ar,原先的hpacucli 不能使用,新的工具为hpssacl hpssacli-2.10-14.0.x86_64.rpm 下载地址:wget ...

  3. JanusGraph 创建索引步骤(composite index)踩坑总结

    前言 JanusGraph是一个图数据库引擎,安装及入门可以参考 JanusGraph 图数据库安装小记.为了提高查询速度,在使用过程中一般要为某些属性创建索引.这篇随笔主要是记录创建索引过程中踩过的 ...

  4. python - django authenticate 返回结果一直是None

    # 不论怎么测试 authenticate 返回结果一直是None,查了查原因好像是 django 2.1 版本的问题 ( 我用的是 2.1.7) 解决方法: 1. 先导入 from django.c ...

  5. IDEA打开项目时,java文件左下角J图标的问题

    idea打开项目时,所有的java文件左下角出现J图标,如下图: 说明项目的资源路径配置有问题,打开Project Structure,如下图: 进行资源路径配置,即可解决问题,正确配置如下:

  6. Oracle 11g 新特性 -- 自适应游标共享(Adaptive Cursor Sharing: ACS) 说明(转载)

    一.自适应游标共享(Adaptive Cursor Sharing) 说明 1.1 ACS概述绑定变量使Oracle DB 可以为多条SQL 语句共享单个游标,以减少分析SQL 语句所使用的共享内存量 ...

  7. (尚016)Vue指令(11个自带指令+自定义指令)

    1.Vue常用指令 1)v:text:更新元素的 textContent 2)v-html:更新元素的 innerHTML 3)v-if:如果为true,当前标签才会输出到页面 4)v-else:如果 ...

  8. am335x system upgrade rootfs using yocto make rootfs(十二)

    1      Scope of Document This document describes how to make am335x arago rootfs using ycoto project ...

  9. 【CSS】Table样式

    一.table td的宽度详解 Table只有Table的宽度是可以设置的,并且各个浏览器理解一致 原则上应该将table的宽度设置成一个固定的值,而不应该设置成一个根据屏幕变化的值 Table的宽度 ...

  10. RookeyFrame 模块 线上创建的模块 迁移到 线下来

    1. 把线上创建的model,写在项目的model层里面. 把文件 Rookey.Frame.Web\Config\TempModel\Order_File.code 复制到model层, 用文本编辑 ...