如果是在windows環境: 使用InetAddress.getLocalHost()方法即可
package com.datongsoft.wg.common.util; import java.net.InetAddress; public class GetIP { public static void main(String[] args) throws Exception { InetAddress addr = InetAddress.getLocalHost(); String ip=addr.getHostAddress().toString(); //獲取本機ip String hostName=addr.getHostName().toString(); //獲取本機計算機名稱 System.out.println(ip); System.out.println(hostName); } }
在linux下,上述獲取IP的方式有時會得到127.0.0.1.
從JDK1.4開始,Java提供了一個NetworkInterface類。這個類可以得到本機所有的物理網絡接口和虛擬機等軟件利用本機的物理網絡接口創建的邏輯網絡接口的信息,
NetworkInterface可以通過getNetworkInterfaces方法來枚舉本機所有的網絡接口。我們也可以利用getNetworkInterfaces得到的網絡接口來枚舉本機的所有IP地址。當然,也可以通過InetAddress類的getAllByName來得到本機的所有IP地址:
public static Enumeration<NetworkInterface> getNetworkInterfaces() throws SocketException
但getNetworkInterfaces方法可以按網絡接口將這些IP地址進行分組,這對於只想得到某個網絡接口上的所有IP地址是非常有用的。
NetworkInterface類提供了三個方法可以分別得到網絡接口名(getName方法)、網絡接口別名(getDisplayName方法)、網絡接口綁定的所有IP地址(getInetAddresses方法):
1. getName()
得到的網絡接口名稱,就是使用getByName方法創建NetworkInterface對象時使用的網絡接口名,如eth0、ppp0等。
public String getName()
2. getDisplayName()
可以得到更容易理解的網絡接口名,也可以將這個網絡接口名稱為網絡接口別名。在一些操作系統中(如Unix),getDisplayName方法和getName方法的返回值相同,但在Windows中getDisplayName方法一般會返回一個更為友好的名字,如Realtek RTL8139 Family PCI Fast Ethernet NIC
public String getDisplayName()
3. getInetAddresses()
以InetAddress對象的形式返回和網絡接口綁定的所有IP地址。
public Enumeration<InetAddress> getInetAddresses()
windows和linux下通用的獲取本機IP的方法
import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; public class Main { public static void main(String[] args) { System.out.println("本機IP:" + getIpAddress()); } public static String getIpAddress() { try { Enumeration<NetworkInterface> allNetInterfaces = NetworkInterface.getNetworkInterfaces(); InetAddress ip = null; while (allNetInterfaces.hasMoreElements()) { NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement(); if (netInterface.isLoopback() || netInterface.isVirtual() || !netInterface.isUp()) {//用於排除回送接口,非虛擬網卡,未在使用中的網絡接口 continue; } else { Enumeration<InetAddress> addresses = netInterface.getInetAddresses(); while (addresses.hasMoreElements()) { ip = addresses.nextElement(); if (ip != null && ip instanceof Inet4Address) { return ip.getHostAddress(); } } } } } catch (Exception e) { System.err.println("IP地址獲取失敗" + e.toString()); } return ""; } }
表示對網絡接口進行篩選,非回送接口 且 非虛擬網卡 且 正在使用中
getRemoteAddr()和getRemoteHost()的區別
- getRemoteAddr()是獲得客戶端的ip地址
- getRemoteHost()是獲得客戶端的主機名
- 獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟件就不能獲取到客戶端的真實IP地址了(比如負載均衡處理)。
public String getRemortIP(HttpServletRequest request) { if (request.getHeader("x-forwarded-for") == null) { return request.getRemoteAddr(); //return request.getRemoteHost(); } return request.getHeader("x-forwarded-for"); } 此處,獲取ip,當x-forwarded-for為null時,表示請求沒有經過處理,此時調用getRemoteAddr()和getRemoteHost()都可獲取真實ip 反之,則getHeader("x-forwarded-for")為真實的ip。
request.getRemoteAddr()取得的是IPv6的地址格式?
因為機器上啟用的IPv6協議,所以在對localhost進DNS解析時,得到的是IPv6形式的本機地址0:0:0:0:0:0:0:1.
實際上這種情況只有在服務器和客戶端在同一台機器上用localhost訪問時才會出現。解決方法如下:
1、使用127.0.0.1代替localhost進行訪問
2、讓tomcat只支持IPv4(方便一些)
-
- a:在eclipse中使用tomcat的修改方法
Run->Run Configurations...->Apache Tomcat->Tomcat v7.0 Server at localhost-> Arguments->VM arguments
在運行參數中添加: -Djava.net.preferIPv4Stack=true
重啟Tomcat在使用request.getRemoteAddr()方法就能得到IPv4的地址了。
-
- b:通過Tomcat的start.bat啟動修改方法
找到Tomcat的bin目錄下的 catalina.bat文件,在其中加入:
set JAVA_OPTS=%JAVA_OPTS% -Djava.net.preferIPv4Stack=true %LOGGING_MANAGER%
重啟Tomcat在使用request.getRemoteAddr()方法就能得到IPv4的地址了。
3、一些其他的方法(不知道什么原因設置之后沒有效果)
修改hosts文件。位置:C:\Windows\System32\drivers\etc
注釋掉# ::1 localhost這一句,可win7本就是注釋掉的。
又添加一句127.0.0.1 localhost說這樣request.getRemoteAddr()函數得到的將是127.0.0.1,可試過了還是沒有效果。
又在網絡和共享中心和注冊表禁用了IPv6也沒有效果