package com.mini.capi.utils;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * 网络连通性检测工具类（支持IPv4和域名）
 */
public class NetworkUtils {


    // 默认检查端口（保持80作为默认，兼容通用场景）
    private static final int DEFAULT_PORT = 80;
    // 默认超时时间（3秒，可根据需求调整）
    private static final int DEFAULT_TIMEOUT_MS = 3000;

    private NetworkUtils() {
        throw new UnsupportedOperationException("工具类不允许实例化");
    }

    /**
     * 检查目标主机（IP/域名）的连通性（使用默认端口80）
     *
     * @param target 目标IP或域名（不可为null/空）
     * @return true：可达；false：不可达（含参数无效/检查失败）
     */
    public static boolean isNetworkReachable(String target) {
        // 调用重载方法，传入默认端口
        return isNetworkReachable(target, DEFAULT_PORT);
    }
    /**
     * 检查目标主机（IP/域名）的连通性（自定义端口）
     */
    public static boolean isNetworkReachable(String target, int port) {
        // 参数校验：目标为空或端口无效，直接返回不可达
        if (target == null || target.trim().isEmpty() || port < 1 || port > 65535) {
            return false;
        }
        String normalizedTarget = target.trim();
        try {
            // 先解析目标地址（只解析一次，避免重复操作）
            InetAddress address = InetAddress.getByName(normalizedTarget);
            // 优先尝试 Socket 连接指定端口
            try (Socket socket = new Socket()) {
                socket.connect(new InetSocketAddress(address, port), DEFAULT_TIMEOUT_MS);
                return true; // 端口连接成功，返回可达
            } catch (Exception e) {
                // Socket 连接失败，不中断流程，继续执行主机可达性检查
            }
            // Socket 失败后，降级检查主机基础可达性（ICMP）
            return address.isReachable(DEFAULT_TIMEOUT_MS);
        } catch (Exception e) {
            // 任何异常（地址解析失败、ICMP 检查失败等）均返回不可达
            return false;
        }
    }
}