java InetAddress.getLocalHost(); 返回127.0.0.1 …如何获得真正的IP?

我正在写一个简单的networking应用程序…我需要知道我的机器在networking上的真实IP,如192.168.1.3。 getLocalHost返回127.0.0.1(在Linux上不知道,如果它是相同的Windows)如何做到这一点?

如果你真的想使用机器上的所有IP地址,你可以使用NetworkInterface类。 当然,那么你需要一个你真正想要使用哪一个,但是这取决于你使用的是什么,或者你可能需要扩展你使用它来说明多个地址的方式。

import java.net.*; import java.util.*; public class ShowInterfaces { public static void main(String[] args) throws Exception { System.out.println("Host addr: " + InetAddress.getLocalHost().getHostAddress()); // often returns "127.0.0.1" Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces(); for (; n.hasMoreElements();) { NetworkInterface e = n.nextElement(); System.out.println("Interface: " + e.getName()); Enumeration<InetAddress> a = e.getInetAddresses(); for (; a.hasMoreElements();) { InetAddress addr = a.nextElement(); System.out.println(" " + addr.getHostAddress()); } } } } 

由于机器可能有多个地址,因此很难确定哪一个适合您。 通常,您希望系统根据其路由表分配一个IP。 结果取决于你想要连接的IP,有一个简单的诀窍:简单地创build一个连接,看看你从操作系统得到了什么地址:

 // output on my machine: "192.168.1.102" Socket s = new Socket("192.168.1.1", 80); System.out.println(s.getLocalAddress().getHostAddress()); s.close(); // output on my machine: "127.0.1.1" System.out.println(InetAddress.getLocalHost().getHostAddress()); 

我不确定是否可以做到这一点,但没有build立连接。 我想我已经用Perl(或C?)设法做到了,但是不要问我关于Java的问题。 我认为有可能创build一个UDP套接字(DatagramSocket)而不实际连接它。

如果在路由器上有NAT路由器,您将无法获得远程主机将看到的IP。 但是,如你给了192. *作为一个例子,我认为你不在乎。

要解决这个问题:

  1. find你的主机名。 types: hostname 。 例如,你发现你的主机名是mycomputer.xzy.com

  2. 把你的主机名放在主机文件中。 /etc/hosts 。 如

     10.50.16.136 mycomputer.xzy.com 

这是一种避免IPv6和环回结果的方法。

 public InetAddress getCurrentIp() { try { Enumeration<NetworkInterface> networkInterfaces = NetworkInterface .getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface ni = (NetworkInterface) networkInterfaces .nextElement(); Enumeration<InetAddress> nias = ni.getInetAddresses(); while(nias.hasMoreElements()) { InetAddress ia= (InetAddress) nias.nextElement(); if (!ia.isLinkLocalAddress() && !ia.isLoopbackAddress() && ia instanceof Inet4Address) { return ia; } } } } catch (SocketException e) { LOG.error("unable to get current IP " + e.getMessage(), e); } return null; } 

您的电脑可能有多个IP。 你怎么知道哪一个? 我这样做的方式是在另一台机器上运行一个非常简单的CGI,它可以报告所看到的IP,而当我需要知道我的IP对外界是什么样的时候,我打了这个CGI。

而不是使用InetAddress.getHostAddress(),我调用我写的getHost4Address例程来获取第一个非回送地址…

 /** * Returns this host's non-loopback IPv4 addresses. * * @return * @throws SocketException */ private static List<Inet4Address> getInet4Addresses() throws SocketException { List<Inet4Address> ret = new ArrayList<Inet4Address>(); Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces(); for (NetworkInterface netint : Collections.list(nets)) { Enumeration<InetAddress> inetAddresses = netint.getInetAddresses(); for (InetAddress inetAddress : Collections.list(inetAddresses)) { if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) { ret.add((Inet4Address)inetAddress); } } } return ret; } /** * Returns this host's first non-loopback IPv4 address string in textual * representation. * * @return * @throws SocketException */ private static String getHost4Address() throws SocketException { List<Inet4Address> inet4 = getInet4Addresses(); return !inet4.isEmpty() ? inet4.get(0).getHostAddress() : null; } 

我写了这个代码:

 import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.util.Collections; import java.util.HashSet; import java.util.Set; private String[] getHostAddresses() { Set<String> HostAddresses = new HashSet<>(); try { for (NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces())) { if (!ni.isLoopback() && ni.isUp() && ni.getHardwareAddress() != null) { for (InterfaceAddress ia : ni.getInterfaceAddresses()) { if (ia.getBroadcast() != null) { //If limited to IPV4 HostAddresses.add(ia.getAddress().getHostAddress()); } } } } } catch (SocketException e) { } return HostAddresses.toArray(new String[0]); } 

核实!

为了我:

  • 一定不是LoopBack!
  • 一定是UP!
  • 必须有MAC地址(不为空)

从当前实例获取当前请求

 HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

然后从请求中获取地址

 ip = httpServletRequest.getRemoteAddr(); 

如果您想要获取PC的IP地址,则必须使用“java.net.InetAddress”库中的“InetAddress”对象。

以下方法返回您的IP:

 public String getIp() { String myIp = ""; InetAddress ip; try { ip = InetAddress.getLocalHost(); myIp = ip.getHostAddress(); // This method returns the IP. } catch (UnknownHostException e) { e.printStackTrace(); } return myIp; }