2010-03-04 9 views
41

Sto scrivendo una semplice app di rete ... Ho bisogno di conoscere l'ip reale della mia macchina sulla rete, come 192.168.1.3. getLocalHost restituisce 127.0.0.1 (su Linux, non so se è lo stesso su Windows) come si fa ?;java InetAddress.getLocalHost(); restituisce 127.0.0.1 ... come ottenere l'IP REALE?

+0

Nelle mie finestre, System.out.println (InetAddress.getLocalHost() getHostAddress().); print 10.50.16.136 –

+0

127.0.1.1 per me (Ubuntu) – sfussenegger

+0

Interessante ... risposta corretta anche se non funziona? – sfussenegger

risposta

3

Il computer potrebbe disporre di più IP. Come fai a sapere quale? Il modo in cui lo faccio è di avere un CGI molto semplice in esecuzione su un'altra macchina che riporta l'IP che è stato visto, e l'ho colpito quando ho bisogno di sapere come appare il mio IP al mondo esterno.

21

Poiché la macchina potrebbe disporre di più indirizzi, è difficile determinare quale è quella giusta per l'utente. Normalmente, si desidera che il sistema assegni un IP in base alla propria tabella di routing. Come il risultato dipende dal IP che desideri connettersi, c'è un trucco semplice: basta creare una connessione e vedere quale indirizzo che hai dal sistema operativo:

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

io non sono sicuro se è possibile farlo senza stabilire una connessione. Penso di essere riuscito una volta a farlo con Perl (o C?), Ma non chiedermi di Java. Penso che potrebbe essere possibile creare un socket UDP (DatagramSocket) senza effettivamente collegarlo.

Se è presente un router NAT, non sarà possibile ottenere l'IP che verranno visualizzati dagli host remoti. Tuttavia, come hai indicato 192. * come esempio, penso che non ti interessi.

28

Se si desidera effettivamente lavorare con tutti gli indirizzi IP sulla macchina, è possibile ottenere quelli con la classe NetworkInterface. Certo, allora devi sapere quale vuoi effettivamente usare, ma questo sarà diverso a seconda di cosa lo stai usando, o potresti dover espandere il modo in cui lo stai usando per tenere conto di più indirizzi.

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()); 
         } 
       } 
     } 
} 
+15

'while (x.hasMoreElements()) {}' sarebbe più ordinato di 'for (; x.hasMoreElements();) {}' – sync

17

Per risolvere il problema:

  1. Trova il nome host. Digitare: hostname. Ad esempio, si trova il nome host è mycomputer.xzy.com

  2. Inserire il nome host nel file hosts. /etc/hosts. Come

    10.50.16.136 mycomputer.xzy.com 
    
8

Ecco un modo per evitare IPv6 e loopback risultati.

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

Ottenere la richiesta corrente dall'istanza corrente

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

quindi ottenere l'indirizzo dalla richiesta

ip = httpServletRequest.getRemoteAddr(); 
+1

Includere brevemente il codice/soluzione renderebbe questa risposta completa! –

+0

Questa risposta sembra quella corretta. Sto cercando l'indirizzo di richiesta del cliente su una richiesta smpp al mio server – PhillipMwaniki

-4

Nel caso in cui si desidera ottenere l'indirizzo IP del PC, utilizzare l'oggetto "InetAddress", che esiste nella libreria "java.net.InetAddress".

il seguente metodo restituisce il tuo 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; 
} 
2

Invece di utilizzare InetAddress.getHostAddress(), che io chiamo la routine getHost4Address che ho scritto per ottenere il primo indirizzo di loopback non ...

/** 
* 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

ho scritto questo codice:

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

Verifica!

Per me:

  • non deve essere loopback!
  • Deve essere UP!
  • Deve avere l'indirizzo MAC (non è nullo)
Problemi correlati