java獲取服務器ip(windows系統和linux系統)

獲取服務器真實ip

InetAddress.getLocalHost().getHostAddress():根據服務器名稱獲取服務器ip,在linux系統下***可能***存在問題

public static String getIp() {

        try{
            if (isWindowsOS()) {
                logger.info("windows Ip --->{}", InetAddress.getLocalHost().getHostAddress());
                return InetAddress.getLocalHost().getHostAddress();
            } else {
                logger.info("linux Ip --->{}", getLinuxLocalIp());
                return getLinuxLocalIp();
            }
        }catch (Exception e){
            logger.error("getIp error--->{}", e.getMessage());
            return  "127.0.0.1";
        }
        
//注意:此處爲之前獲取ip的方式,
//InetAddress.getLocalHost()是根據服務器名稱來獲取ip,
//當服務器ect/hostname下未配置服務器ip對應的服務器名稱時,
//則本地windows系統開發可以,但在linux系統下找不到服務器ip.如ps 圖1
//        String hostAddress ="";
//        try {
//            InetAddress address = InetAddress.getLocalHost();//獲取的是本地的IP地址
//            hostAddress = address.getHostAddress();
//        } catch (UnknownHostException e) {
//            e.printStackTrace();
//        }
//        return hostAddress;
    }

    private static boolean isWindowsOS() {
        boolean isWindowsOS = false;
        String osName = System.getProperty("os.name");
        if (osName.toLowerCase().indexOf("windows") > -1) {
            isWindowsOS = true;
        }
        return isWindowsOS;
    }

    private static String getLinuxLocalIp() throws SocketException {
        String ip = "";
        try {
            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                NetworkInterface intf = en.nextElement();
                String name = intf.getName();
                if (!name.contains("docker") && !name.contains("lo")) {
                    for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                        InetAddress inetAddress = enumIpAddr.nextElement();
                        if (!inetAddress.isLoopbackAddress()) {
                            String ipaddress = inetAddress.getHostAddress().toString();
                            if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")) {
                                ip = ipaddress;
                                System.out.println(ipaddress);
                            }
                        }
                    }
                }
            }
        } catch (SocketException ex) {
            logger.error("getLinuxLocalIp error--->{}", ex.getMessage());
            ip = "127.0.0.1";
            ex.printStackTrace();
        }
        logger.error("getLinuxLocalIp ip--->{}", ip);
        return ip;
    }

ps 圖1:linux系統中,etc/hostname下沒有配置服務器ip對應的服務名稱,則導致代碼中的問題
在這裏插入圖片描述
首先在運維層面講,這個配置是否應該去掉,我不太清楚,但是如果註釋掉,項目中持續出現問題
如下:
在這裏插入圖片描述
有更瞭解的同學,希望幫助解答疑惑

發佈了48 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章