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?
risposta
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.
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.
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());
}
}
}
}
'while (x.hasMoreElements()) {}' sarebbe più ordinato di 'for (; x.hasMoreElements();) {}' – sync
Per risolvere il problema:
Trova il nome host. Digitare:
hostname
. Ad esempio, si trova il nome host èmycomputer.xzy.com
Inserire il nome host nel file hosts.
/etc/hosts
. Come10.50.16.136 mycomputer.xzy.com
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;
}
Ottenere la richiesta corrente dall'istanza corrente
HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
quindi ottenere l'indirizzo dalla richiesta
ip = httpServletRequest.getRemoteAddr();
Includere brevemente il codice/soluzione renderebbe questa risposta completa! –
Questa risposta sembra quella corretta. Sto cercando l'indirizzo di richiesta del cliente su una richiesta smpp al mio server – PhillipMwaniki
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;
}
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;
}
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)
- 1. InetAddress.getLocalHost() restituisce sempre 127.0.0.1
- 2. InetAddress.getLocalHost(). GetHostAddress() restituisce 127.0.0.1 in Android
- 3. Java. InetAddress.getLocalHost restituisce lo strano IP
- 4. Express - req.ip restituisce 127.0.0.1
- 5. InetAddress.getLocalHost() genera UnknownHostException
- 6. Django ottiene IP restituisce solo 127.0.0.1
- 7. Come posso ottenere l'errore reale dietro HttpResponseException?
- 8. Utilizzando Django, perché REMOTE_ADDR restituisce 127.0.0.1 su un server web?
- 9. DNS reindirizza tracker.thepiratebay.org a 127.0.0.1
- 10. Ottenere hostname con Java non riesce in ultima jdk7
- 11. Come ottenere l'IP reale dal visitatore?
- 12. Come ottenere la firma reale con% ROWTYPE
- 13. Come ottenere l'altezza reale di un testo?
- 14. Come ottenere il file reale da S3 utilizzando CarrierWave
- 15. OperationTimedOut: errors = {}, last_host = 127.0.0.1
- 16. Come ottenere un tempo reale nella transazione PostgreSQL?
- 17. come ottenere il tipo reale/tipo mime in JAVA (come finfo \ mime_content_type in PHP)?
- 18. Come ottenere l'indirizzo IP del client in Java HttpServletRequest
- 19. Come ottenere la durata reale, reale di un file MP3 (VBR o CBR) lato server
- 20. Express.js req.ip sta restituendo :: ffff: 127.0.0.1
- 21. localhost vs. 127.0.0.1
- 22. Java Restituisce il metodo che restituisce l'arraylist?
- 23. HashMap ottenere restituisce null
- 24. Come posso ottenere in modo sicuro l'indirizzo IP reale dell'utente in Flask (usando mod_wsgi)?
- 25. Come: pow (reale, reale) in x86
- 26. Grafico in tempo reale in Java
- 27. Come ottenere errno quando epoll_wait restituisce EPOLLERR?
- 28. come ottenere un orologio in tempo reale in C#?
- 29. Come ottenere foto reali da instagram dati in tempo reale?
- 30. Java Singleton.getInstance() restituisce null?
Nelle mie finestre, System.out.println (InetAddress.getLocalHost() getHostAddress().); print 10.50.16.136 –
127.0.1.1 per me (Ubuntu) – sfussenegger
Interessante ... risposta corretta anche se non funziona? – sfussenegger