J'écris une simple application de mise en réseau ... J'ai besoin de connaître la véritable IP de ma machine sur le réseau, comme 192.168.1.3. getLocalHost renvoie 127.0.0.1 (sous Linux, ne sais pas si c'est la même chose sous Windows) comment faire ?;
Si vous voulez réellement travailler avec toutes les adresses IP sur la machine, vous pouvez les obtenir avec la classe NetworkInterface. Bien sûr, vous devez alors choisir celui que vous souhaitez réellement utiliser, mais cela va être différent selon l'utilisation que vous en faites, ou vous devrez peut-être étendre la façon dont vous l'utilisez pour prendre en compte plusieurs adresses.
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());
}
}
}
}
Comme la machine peut avoir plusieurs adresses, il est difficile de déterminer celle qui vous convient. Normalement, vous souhaitez que le système attribue une IP en fonction de sa table de routage. Comme le résultat dépend de l'adresse IP à laquelle vous souhaitez vous connecter, il existe une astuce simple: créez simplement une connexion et voyez quelle adresse vous avez du système d'exploitation:
// 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());
Je ne sais pas s'il est possible de le faire sans établir de connexion. Je pense que j'ai réussi à le faire avec Perl (ou C?), Mais ne me posez pas de questions sur Java. Je pense qu'il pourrait être possible de créer un socket UDP (DatagramSocket) sans le connecter réellement.
S'il y a un NAT routeur sur le chemin, vous ne pourrez pas obtenir l'adresse IP que les hôtes distants verront cependant. Cependant, comme vous l'avez donné 192. * à titre d'exemple, je pense que vous s'en fout.
Réparer:
Trouvez votre nom d'hôte. Tapez: hostname
. Par exemple, vous trouvez que votre nom d'hôte est mycomputer.xzy.com
Mettez votre nom d'hôte dans votre fichier d'hôtes. /etc/hosts
. Tel que
10.50.16.136 mycomputer.xzy.com
Voici un moyen d'éviter les résultats IPv6 et 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;
}
Votre ordinateur peut avoir plusieurs adresses IP. Comment savez-vous lequel? La façon dont je le fais est d'avoir un CGI très simple fonctionnant sur une autre machine qui rapporte l'IP qu'il a vu, et je l'ai frappé quand j'ai besoin de savoir à quoi ressemble mon IP pour le monde extérieur.
Au lieu d'utiliser InetAddress.getHostAddress (), j'appelle la routine getHost4Address que j'ai écrite pour obtenir la première adresse sans boucle ...
/**
* 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;
}
J'ai écrit ce code:
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]);
}
Vérifie ça!
Pour moi:
Obtenez l'adresse IP de la boîte actuelle correspondant à un modèle:
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){ }
Résultat:
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'
Récupère la demande actuelle de l'instance actuelle
HttpServletRequest httpServletRequest = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
puis obtenez l'adresse de la demande
ip = httpServletRequest.getRemoteAddr();