JAVA-扫描局域网、自定义网段IP加端口在线设备

用JAVA去获取局域网中在线设备的需求,比如我的设备IP是192.168.1.3,我需要先判断是否在线这会你就会想到的是PING但是加上端口呢?比如我的设备IP是192.168.1.3:8080呢?根据IP加端口扫描;以下是我整理出来的解决方案:

  /**
     * @description: 获取设备在线状态
     * @param networkSegment 网段 port 端口
     * @return Map<String,Boolean>
     * @author panlupeng
     * @date 2022/3/22 16:19
     */
    public static Map<String,Boolean> getDeviceOnLineStatus(String networkSegment,int port){
        Map<String,Integer> map=new LinkedHashMap<>();
        Map<String,Boolean> resultMap=new HashMap();
        if(StringUtils.isEmpty(networkSegment)){
            try{
                networkSegment = InetAddress.getLocalHost().getHostAddress();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        int lastPoint = networkSegment.lastIndexOf('.');
        String ipHead = networkSegment.substring(0, ++lastPoint);
        for (int num = 1; num < 255; num++) {
            String ip = ipHead + String.valueOf(num);
            map.put(ip,port);
        }
        if(!CollectionUtils.isEmpty(map)){
            Iterator<Map.Entry<String, Integer>> entries = map.entrySet().iterator();
            while(entries.hasNext()){
                Map.Entry<String, Integer> entry = entries.next();
                boolean pingIpAndPort = pingIpAndPort(entry.getKey(),entry.getValue());
                System.out.println("IP为:"+entry.getKey()+",连接状态:"+pingIpAndPort);
                resultMap.put(entry.getKey(),pingIpAndPort);
            }
        }
        return resultMap;
    }
    
    /**
     * @description: PING IP网络
     * @param  ip
     * @return boolean
     * @author panlupeng
     * @date 2022/3/22 16:53 
     */
    public static boolean pingDeviceIp(String ip){
        if(StringUtils.isEmpty(ip)){
            return false;
        }
        if (!pingIp(ip)) {
            return false;
        }
        int timeOut = 3000;
        boolean reachable =false;
        try{
            reachable = InetAddress.getByName(ip).isReachable(timeOut);
        }catch (Exception e){
            e.printStackTrace();
        }
        return reachable;
    }

    /**
     * ping ip
     *
     * @param ip
     * @return
     */
    public static boolean pingIp(String ip) {
        if (null == ip || 0 == ip.length()) {
            return false;
        }
        try {
            InetAddress.getByName(ip);
            return true;
        } catch (IOException e) {
            return false;
        }
    }

    /**
     * ping ip加端口
     *
     * @param ip
     * @param port
     * @return
     */
    public static boolean pingIpAndPort(String ip, String port) {
        if (null == ip || 0 == ip.length() || null == port || 0 == port.length() || !isInt(port) || !isRangeInt(port, 1024, 65535)) {
            return false;
        }
        return pingIpAndPort(ip, Integer.parseInt(port));
    }

    /**
     * 判断是否是整数
     *
     * @param str
     * @return
     */
    public static boolean isInt(String str) {
        if (!isNumeric(str)) {
            return false;
        }
        // 该正则表达式可以匹配所有的数字 包括负数
        Pattern pattern = Pattern.compile("[0-9]+");

        Matcher isNum = pattern.matcher(str); // matcher是全匹配
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

    /**
     * 匹配是否包含数字
     *
     * @param str
     * @return
     */
    public static boolean isNumeric(String str) {
        if (null == str || 0 == str.length()) {
            return false;
        }
        if (str.endsWith(".")) {
            return false;
        }
        // 该正则表达式可以匹配所有的数字 包括负数
        Pattern pattern = Pattern.compile("-?[0-9]+\\.?[0-9]*");

        Matcher isNum = pattern.matcher(str); // matcher是全匹配
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }

    /**
     * 是否在范围内
     *
     * @param str
     * @param start
     * @param end
     * @return
     */
    public static boolean isRangeInt(String str, int start, int end) {
        if (!isInt(str)) {
            return false;
        }
        int i = Integer.parseInt(str);
        return i > start && i < end;
    }

测试结果:
在这里插入图片描述
用JAVA PING IP 网络解决方案如下:

    /**
     * @description: PING IP网络
     * @param  ip
     * @return boolean
     * @author panlupeng
     * @date 2022/3/22 16:53 
     */
    public static boolean pingDeviceIp(String ip){
        if(StringUtils.isEmpty(ip)){
            return false;
        }
        if (!pingIp(ip)) {
            return false;
        }
        int timeOut = 3000;
        boolean reachable =false;
        try{
            reachable = InetAddress.getByName(ip).isReachable(timeOut);
        }catch (Exception e){
            e.printStackTrace();
        }
        return reachable;
    }

演示结果:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nmap (Network Mapper) 是一款开源的网络探测和安全审计工具。它可以帮助您发现网络拓扑、识别服务、操作系统及漏洞等信息。 ### 使用 Nmap 扫描局域网IP端口的基本步骤: #### 准备工作: 1. **安装 Nmap**:首先确保您的计算机上已经安装了 Nmap。对于大多数 Linux 发行版,可以使用包管理器直接安装。例如,在 Ubuntu 或 Debian 上运行 `sudo apt-get install nmap`。 #### 扫描局域网内的全部 IP 地址: 通常情况下,家庭或小办公室的局域网可能会有如下的 IP 地址范围:192.168.1.x 或者 10.x.x.x 或者 172.16.x.x 等等。为了简化描述,我们假设您的局域网地址范围为 192.168.1.1 到 192.168.1.254。 #### 使用命令行进行扫描: 使用 Nmap 进行全范围扫描(从 1 到 254 的所有 IP),您可以输入以下命令并按回车键运行: ```bash nmap -sn 192.168.1.1-192.168.1.254 ``` 这里 `-sn` 参数表示只进行主机发现,而不进行服务探测。 #### 解读结果: 运行上述命令后,Nmap 将会返回一系列结果,包括哪些 IP 地址是活动的,以及它们是否属于相同的子网。这一步仅检测设备是否在线,并不会尝试连接到各个设备上的特定服务。 如果需要进一步对在线设备进行服务探测和详细的安全检查,您可以修改命令,添更多的选项,比如指定端口号或目标端口列表。 #### 详细说明与选项: - **端口扫描**:要针对特定IP端口进行扫描,使用 `-p` 参数指明要扫描端口列表,例如 `nmap -sS -p 80,443,22 192.168.1.1`。 - **详细模式**:使用 `-v` 参数增扫描过程的信息量。 - **快速模式**:使用 `-F` 参数进行快速的TCP SYN扫描。 - **UDP扫描**:使用 `-sU` 参数来进行UDP端口扫描。 #### 安全注意事项: - 对于全扫描操作,虽然实用,但也可能引起某些网络环境的怀疑或触发防火墙规则。因此,建议在合法范围内使用此工具,并尊重目标网络的所有权和隐私。 - 确保您有权访问正在扫描网络,并遵守当地法律法规。 通过以上步骤和注意事项,您可以有效地利用 Nmap 工具扫描局域网内所有设备的全端口情况。记得谨慎使用此类工具以避免不必要的冲突或违法行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值