1. 程式人生 > >如何獲取本機內網和外網IP(windows+linux)

如何獲取本機內網和外網IP(windows+linux)

1:場景描述

在做Netty相關專案的時候,我們往往需要繫結本機的IP和埠號,如果我們把它寫在配置檔案中,那麼我們每次換電腦執行或者部署到其他環境時候都需要修改配置檔案。這樣就會比較麻煩,如果我們把它做成智慧的獲取本機的IP,這樣我們的程式碼的可移植性就提高了。下面就介紹一種在windows和linux下面可以智慧獲取我們本機的區域網IP和外網IP的方法,不妥之處還請大家多多指教。

2:解決方法以及程式碼

首先貼上獲取IP的工具類

/**
 * Copyright (C) 2015 Raxtone
 *
 * @className:com.test.ip.IPUtils
 * @description
:智慧判斷windows&linux平臺獲取外網ip和區域網ip工具類 * 注:window 獲取外網IP是通過一個外部網站http://www.ip138.com/ip2city.asp * linux環境還需要額外的test.sh指令碼(並且路徑和本工具類一致) * @version:v1.0.0 * @author:yunqigao * * Modification History: * Date Author Version Description * ----------------------------------------------------------------- * 2015-3-28 yunqigao v1.0.0 create * * */
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.net.InetAddress; import java.net.URL; import java.net.UnknownHostException; public class IPUtils { private static String OS_NAME = null; /** * 查詢本機外網IP網站 */
private static final String getWebIP = "http://www.ip138.com/ip2city.asp"; /** * 預設值 */ private static String IP = "未知"; static { System.out.println("初始化獲取系統名稱..."); OS_NAME = System.getProperty("os.name"); } public static String getIP(int queryFlag) { if (queryFlag == 1) { // 查詢外網IP switch (IPUtils.getOsType()) { case 1: IP = IPUtils.getWinOuterIP(); break; case 2: IP = IPUtils.getLinuxIP(queryFlag); break; default: break; } } else { // 查詢內網IP switch (IPUtils.getOsType()) { case 1: IP = IPUtils.getWinInnerIP(); break; case 2: IP = IPUtils.getLinuxIP(queryFlag); break; default: break; } } return IP; } /** * 獲取window平臺下外網IP * * @return IP */ private static String getWinOuterIP() { try { URL url = new URL(getWebIP); BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); String s = ""; StringBuffer sb = new StringBuffer(""); String webContent = ""; while ((s = br.readLine()) != null) { //System.err.println("---"+s); sb.append(s + "\r\n"); } br.close(); webContent = sb.toString(); int start = webContent.indexOf("[") + 1; int end = webContent.indexOf("]"); webContent = webContent.substring(start, end); return webContent; } catch (Exception e) { //e.printStackTrace(); System.err.println("獲取外網IP網站訪問失敗!"); return IP; } } /** * 獲取window平臺下內網IP * * @return IP */ private static String getWinInnerIP() { InetAddress[] inetAdds; try { inetAdds = InetAddress.getAllByName(InetAddress.getLocalHost() .getHostName()); } catch (UnknownHostException e) { e.printStackTrace(); return IP; } return inetAdds[0].getHostAddress(); } /** * 獲取linux下的IP * @param queryFlag * 1表示查詢外網IP 2表示查詢內網IP * @return IP * @throws IOException */ private static String getLinuxIP(int queryFlag) { LineNumberReader input = null; String pathString = IPUtils.class.getResource("/").getPath(); //類的路徑 //System.out.println(pathString); Process process=null; String line = ""; try { Runtime.getRuntime().exec("dos2unix "+pathString+"test.sh"); process = Runtime.getRuntime().exec("sh "+pathString+"test.sh "+(queryFlag==1?"1":"2")); InputStreamReader ir = new InputStreamReader(process.getInputStream()); input = new LineNumberReader(ir); if((line = input.readLine()) != null) { IP = line; } } catch (IOException e) { e.printStackTrace(); System.err.println("linux下獲取IP失敗!"); } //System.out.println("exec shell result:ip====>" + IP); return IP; } /** * 目前只支援window和linux兩種平臺 * * @return 1 window 2 linux -1:未知 */ public static int getOsType() { // 將獲取到的系統型別名稱轉為全部小寫 OS_NAME = OS_NAME.toLowerCase(); if (OS_NAME.startsWith("win")) { return 1; } if (OS_NAME.startsWith("linux")) { return 2; } return -1; } /** * 測試方法 * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { System.out.println("作業系統為:"+SystemOperate.fromCode(IPUtils.getOsType()+"")); System.out.println("內網IP為:"+IPUtils.getIP(2)); System.out.println("外網IP為:"+IPUtils.getIP(1)); } }

下面是一個關於作業系統型別和名稱的輔助列舉類


/**
 * Copyright (C) 2015 Raxtone
 *
 *
 * @className:.SystemOperate
 * @description:TODO
 *
 * @version:v1.0.0
 * @author:yunqigao
 *
 * Modification History:
 * Date Author Version Description
 * -----------------------------------------------------------------
 * 2015-3-28 yunqigao v1.0.0 create
 *
 *
 */
import java.util.Map;
import java.util.HashMap;
/**
 * 作業系統名稱列舉
 * 目前只有windows 和 linux系統
 * @author Relieved
 *
 */
enum SystemOperate{
    WINDOWS(1,"windows系統"),LINUX(2,"linux系統"),UNKNOWN(3,"未知系統");

    private int operateType;
    private String operateName;

    private SystemOperate(int operateType, String operateName) {
        this.operateType = operateType;
        this.operateName = operateName;
    }
    public int getOperateType() {
        return operateType;
    }
    public void setOperateType(int operateType) {
        this.operateType = operateType;
    }
    public String getOperateName() {
        return operateName;
    }
    public void setOperateName(String operateName) {
        this.operateName = operateName;
    }
    private static final Map<String, SystemOperate> lookup = new HashMap<String, SystemOperate>();
    static {
        for (SystemOperate cp : values()) {
            lookup.put(cp.getOperateType()+"", cp);
        }
    }
    public static String fromCode(String code) {
        return lookup.get(code).operateName;
    }
}

在windows系統下面直接執行工具類就可以看到下圖獲取到的IP
這裡寫圖片描述
如果是在linux系統下我們還需要下面一個指令碼test.sh

#!/bin/sh
#Copyright (C) 2015 Raxtone
#2015-3-28 
#author:yunqigao 
# Get OS name
    OS=`uname`
    IP=""
# store IP
function getIp(){
if [ $1 == "1" ];then
#echo "outer";
    case $OS in
        Linux) IP=`curl ifconfig.me`;;
        #FreeBSD|OpenBSD) IP=`ifconfig  | grep -E 'inet.[0-9]' | grep -v '127.0.0.1' | awk '{ print $2}'` ;;
        #SunOS) IP=`ifconfig -a | grep inet | grep -v '127.0.0.1' | awk '{ print $2} '` ;;
        *) IP="Unknown";;
    esac
else
#echo "inner";
    case $OS in
        Linux) IP=`ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`;;
        *) IP="Unknown";;
    esac
fi
echo "$IP";
}
getIp $1;

注:該指令碼應該和工具類IPUtils放在同一目錄下,不過你也可以自己定義,自己修改路徑就需要修改工具類IPUtils的getLinuxIP方法,將裡面執行指令碼的程式碼改成你指令碼所在的目錄即可
然後將編譯後的.class檔案和test.sh指令碼一起拷貝到linux系統中,然後執行java IPUtils,就可以看到如下資訊!
這裡寫圖片描述
在其他類中直接用下面的就可獲取到本機的區域網和外網IP了

區域網IP為:
IPUtils.getIP(2));
外網IP為:
IPUtils.getIP(1));

相關推薦

java 獲取的公網、ip

本機通過路由器聯網,獲取ip時獲取的是路由器分配的IP。 獲取公網的IP: 檢查元素,可以獲得一個地址 直接訪問這個網站進行擷取 import java.io.BufferedReader; import java.io.IOException; import ja

如何獲取IP(windows+linux)

1:場景描述 在做Netty相關專案的時候,我們往往需要繫結本機的IP和埠號,如果我們把它寫在配置檔案中,那麼我們每次換電腦執行或者部署到其他環境時候都需要修改配置檔案。這樣就會比較麻煩,如果我們把它做成智慧的獲取本機的IP,這樣我們的程式碼的可移植性就提高了

JAVA 獲取當前 IP 地址

import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.URL; public class UserIP

穿透,使電腦能夠被訪問

步驟:natapp官網註冊並實名——》購買免費隧道——》配置通道——》下載客戶端——》啟動客戶端——》獲取authtoken——》測試。 官網地址:http://natapp.cn/ 1 本章內容以windows環境為例將本地環境穿透的詳細流程。 1、 進

的區別

簡單 打開 png 連接 哪些 一個人 log img 的人 上網也許已經成為生活的標配,每天打開網頁看新聞看視頻聊天等。也許很多人都不知道什麽是內網什麽是外網。今天和大家分享一下互聯網的一些知識吧! 內網。請看看下圖:其實很多時候我們的電腦不是直接連到Internet

設置筆記本同時使用

style 分享 blog print col mage 5.1 ont alt 保證外網已經連接並可上網的情況下, 插上內網網線,執行以下三步: 1.查看外網ip和內網ip及躍點數 cmd命令窗口輸入route print, 如下圖: 2.修改外網躍點數 查看外網的In

python判斷合法IP並區分地址

內網 xtran 3.4 for imp app lse -s mat import redef legit_ip(_ip): compile_ip = re.compile(‘^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5

apache 壓縮及 使用ngrok將對映為一個的Web伺服器

開啟Apache的gzip壓縮 要讓apache支援gzip功能,要用到deflate_Module和headers_Module。開啟apache的配置檔案httpd.conf,大約在105行左右,找到以下兩行內容:(這兩行不是連續在一起的) #LoadModule defla

新增靜態路由使主機可以同時訪問(不同段)

現在我們有兩張網絡卡,一張有線網絡卡,一張無線網絡卡,閘道器分別為: 有線網絡卡為192.168.1.254 無線網絡卡為192.168.3.1 我們可以新增兩條靜態路由來同時訪問兩個網段: route -p add 0.0.0.0 mask 0.0.0.0 192.168.3

Linux 網路程式設計——之間的通訊流程

對於初學者而已,我們學習的網路程式設計(如TCP,UDP程式設計),我們通常都是在區域網內進行通訊測試,有時候我們或者會想,我們現在寫的內網網路資料和外網的網路資料有什麼不同,我們內網的資料是如何走出外網的呢? 再者,我們大多人都是使用寬頻上網,結果發現,A 和 B 的區域網 IP 都是192.

之間的通訊(埠對映原理)

    首先解釋一下“內網”與“外網”的概念:     內網:即所說的區域網,比如學校的區域網,區域網內每臺計算機的IP地址在本區域網內具有互異性,是不可重複的。但兩個區域網內的內網IP可以有相同的。     外網:即網際網路,區域網通過一臺伺服器或是一個路由器對外連線的網路,這個IP地址是惟一的。也就是說內

JAVA+FTP實現跨伺服器獲取檔案,支援區域網

     1.FTP服務是filezilla server。 下載地址: https://filezilla-project.org/ 2.filezilla server安裝及配置教程 教程地址: https:

關於 區別

關於內網和外網 網上經常看到有人問內網和外網的區別,其實外網和內網的概念很模糊,全看你怎麼理解。希望這篇文章能幫助大家明確一些概念。 簡單的說,自己的單位或者家庭、小區內部有區域網;單位、家庭之外有覆蓋範圍極大的網路,比如internet,這個大網路延伸

五分鐘搞懂之間的通訊的原理

寫的通熟易懂,特轉過來備忘!原創連結找不到了        對於初學者而已,我們學習的網路程式設計(如TCP,UDP程式設計),我們通常都是在區域網內進行通訊測試,有時候我們或者會想,我們現在寫的內網網路

UDP連線通訊的問題

這幾天忙著搞UDP的socket通訊,忙乎了幾天終於有點成就了,竊喜下。。。。 如果你不懂內網和外網的區別,不懂區域網和廣域網就先熟悉下,再來看程式。我目前的情況是客戶端在一個內網上,要連線外網的伺服器,外網伺服器在收到客戶端的請求後,反饋資訊給客戶端。 請注意是UDP,不

LinuxWindows遠端連線(區域網連線與區域網連線)

區域網內: 1. Windows->Windows(mstsc)     1) 開啟被連線windows遠端連線。 我的電腦->屬性>遠端->允許遠端計算機連線。     2) win+R輸入mstsc(就是開始 附件 遠端桌面連線),開啟遠端桌面連

virtualbox centos7 雙絡卡實現虛擬主機雙訪問

    ipv4.method auto通過以上命令之後,應該就可以訪問外網了,可以通過  ping www.baidu.com 測試實現2:     新增第二塊虛擬網絡卡  host-only方式        然後重啟,此時 通過        ifconfig      可以看到網絡卡資訊    此時只

之間的通訊

對於初學者而已,我們學習的網路程式設計(如TCP,UDP程式設計),我們通常都是在區域網內進行通訊測試,有時候我們或者會想,我們現在寫的內網網路資料和外網的網路資料有什麼不同,我們內網的資料是如何走出

一分鐘搞懂

對於初學者而已,我們學習的網路程式設計(如TCP,UDP程式設計),我們通常都是在區域網內進行通訊測試,有時候我們或者會想,我們現在寫的內網網路資料和外網的網路資料有什麼不同,我們內網的資料是如何走出外網的呢? 再者,我們大多人都是使用寬頻上網,結果發現,A 和

電腦同時連線route命令

         如何讓電腦同時連線多個網路呢?經常會遇到這樣的情況,一臺電腦如果連上了內網(區域網),外網(因特網)就不能訪問了;要是連上了外網,內網就不能正常訪問了。能否同時上內網和外網呢?答案是肯定的,其實一臺可以同時連線多個網路,只需設定合理的路由。