web-dev-qa-db-ja.com

java InetAddress.getLocalHost();は127.0.0.1を返します... REAL IPを取得する方法は?

簡単なネットワークアプリを作成しています... 192.168.1.3のように、ネットワーク上のマシンの実際のIPを知る必要があります。 getLocalHostは127.0.0.1を返します(Linuxでは、Windowsでも同じ場合はdunno)方法は?

51
gotch4

実際にマシン上のすべての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());
                        }
                }
        }
}
33
Eric

マシンには複数のアドレスがある場合があるため、どのアドレスが自分に適しているかを判断するのは困難です。通常、システムはルーティングテーブルに基づいてIPを割り当てます。結果は接続するIPに依存するため、簡単なトリックがあります。接続を作成し、OSから取得したアドレスを確認するだけです。

// 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. *を指定した場合、気にしない。

21
sfussenegger

修正するには:

  1. ホスト名を見つけます。タイプ:hostname。たとえば、ホスト名はmycomputer.xzy.com

  2. ホストファイルにホスト名を入力します。 /etc/hosts。といった

    10.50.16.136 mycomputer.xzy.com
    
18
boom boom

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

コンピューターには複数のIPがある場合があります。どっちがわかりますか?私がやる方法は、見たIPを報告する非常に簡単なCGIを別のマシンで実行することです。そして、自分のIPが外の世界にどのように見えるかを知る必要があるとき、それを打ちます。

3
Paul Tomblin

代わりに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;
}
2
Ken Lin

私はこのコードを書きました:

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ではない必要があります!
  • アップする必要があります!
  • MACアドレスが必要です(nullではない)
2
chepe lucho

パターンに一致する現在のボックスの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'
1

現在のインスタンスから現在のリクエストを取得する

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

次に、リクエストからアドレスを取得します

ip = httpServletRequest.getRemoteAddr();
1
Eleven