java InetAddress.getLocalHost();返回127.0.0.1 ...如何获得REAL IP?

时间:2010-03-04 17:23:53

标签: java networking

我正在编写一个简单的网络应用程序...我需要知道我的机器在网络上的真实IP,如192.168.1.3。 getLocalHost返回127.0.0.1(在Linux上,dunno,如果它在Windows上是相同的)怎么做?;

11 个答案:

答案 0 :(得分:33)

如果您确实想要使用计算机上的所有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());
                        }
                }
        }
}

答案 1 :(得分:21)

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

// 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());

我不确定在没有建立连接的情况下是否可以这样做。我想我曾经设法用Perl(或C?)来做,但不要问我关于Java的问题。我认为有可能在没有实际连接的情况下创建UDP套接字(DatagramSocket)。

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

答案 2 :(得分:18)

修复它:

  1. 找到您的主机名。输入:hostname。例如,您发现主机名为mycomputer.xzy.com

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

    10.50.16.136 mycomputer.xzy.com
    

答案 3 :(得分:11)

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

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;
        }

答案 4 :(得分:3)

您的计算机可能有多个IP。你怎么知道哪一个?我这样做的方法是在另一台机器上运行一个非常简单的CGI,报告它所看到的IP,当我需要知道我的IP对外界的看法时,我会点击它。

答案 5 :(得分:2)

我没有使用InetAddress.getHostAddress(),而是调用我编写的getHost4Address例程来获取第一个非环回地址...

python2.7

答案 6 :(得分:2)

我写了这段代码:

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地址(不为空)

答案 7 :(得分:1)

从当前实例获取当前请求

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

然后从请求中获取地址

ip = httpServletRequest.getRemoteAddr();

答案 8 :(得分:1)

获取与模式匹配的当前框的IP地址:

import java.io.*; 
import java.util.*; 
import java.util.regex.Pattern; 

String ipPattern = "(192.1.200.)(\\d){1,3}";      //your organization pattern 
try{ 
    Enumeration en = NetworkInterface.getNetworkInterfaces(); 
    while (en.hasMoreElements()) { 
        NetworkInterface ni = (NetworkInterface) en.nextElement(); 
        Enumeration ee = ni.getInetAddresses(); 
        while (ee.hasMoreElements()) { 
            InetAddress ia = (InetAddress) ee.nextElement(); 
            String ip = ia.getHostAddress(); 
            System.out.println("ip: '" + ip + "'\n"); 
            boolean matched = Pattern.matches(ipPattern, ip); 
            if (matched) { 
                System.out.println("matched\n"); 
            }
        } 
    } 
} 
catch(Exception e){ } 

结果:

ip: 'fe80:0:0:0:510a:528b:7204:39d0%enp0s25'
ip: '192.1.200.3'
matched
ip: '0:0:0:0:0:0:0:1%lo'
ip: '127.0.0.1'

答案 9 :(得分:-1)

我遇到相同问题的最短解决方案

搜索后,我发现PCHsotName在文件“ / etc / hosts”

中获得了IP地址127.0.1.1。

1)因此,使用任何编辑器

打开文件 / etc / hosts

我用过纳米

$ sudo nano /etc/hosts

2)并在行首添加“#”

127.0.1.1 HostName

#127.0.1.1 HostName

3)Ctrl + o保存

4)ctrl + x退出Nano编辑器

  

注意::“主机名”取决于您的计算机或服务器的名称。

答案 10 :(得分:-5)

如果您想获取PC的IP地址,则必须使用“InetAddress”对象,该对象存在于“java.net.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;
}