如果是在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也没有效果