Question

Vous avez donc une chaîne extraite d’une interface utilisateur Web d’administrateur (il s’agit donc bien d’une chaîne). Comment savoir si cette chaîne est une adresse IP ou un nom d’hôte en Java?

Mise à jour: Je pense ne pas avoir été clair, je demandais plutôt s'il y avait quoi que ce soit dans le SDK Java que je puisse utiliser pour faire la distinction entre les adresses IP et les noms d'hôte? Désolé pour la confusion et merci à tous ceux qui ont pris / prendront le temps de répondre à cette question.

Était-ce utile?

La solution

Vous pouvez utiliser une expression régulière avec ce modèle:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Cela vous indiquera s'il s'agit d'une adresse IPv4.

Autres conseils

Faisons-nous pour supposer que c'est l'un ou l'autre et non quelque chose de complètement différent? Si tel est le cas, j'utiliserais probablement une expression régulière pour voir si elle correspond au "quad pointillé". format.

Vous pouvez voir si la chaîne correspond au format number.number.number.number, par exemple:

\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

correspond à quoi que ce soit entre 0 - 999 .

Tout ce que vous pouvez avoir comme nom d'hôte par défaut.

URI validator = new URI(yourString);

Ce code validera l'adresse IP ou le nom d'hôte. (Il lève une exception d'URI mal formée si la chaîne n'est pas valide.)

Si vous essayez de distinguer les deux… alors je lis votre question.

Ne pourriez-vous pas simplement faire un match d'expression régulière?

Vous pouvez utiliser un gestionnaire de sécurité avec l'appel InetAddress.getByName (addr) .

Si l'adresse n'est pas un quad pointillé, getByName tentera de se connecter pour rechercher le nom, ce que le responsable de la sécurité peut capturer sous la forme d'un checkConnect (addr, -1). , entraînant une exception SecurityException que vous pouvez intercepter.

Vous pouvez utiliser System.setSecurityManager () si vous exécutez tous les privilèges pour insérer votre gestionnaire de sécurité personnalisé avant l'appel getByName .

Ce n’est pas aussi simple que cela puisse paraître, il existe certaines ambiguïtés autour de caractères tels que les traits d’union, les traits de soulignement et les crochets '-', '_', '[]'.

Le SDK Java présente certaines limitations dans ce domaine. Lorsque vous utilisez InetAddress.getByName, le réseau effectue la résolution du nom DNS et la résolution de l'adresse, ce qui est coûteux et inutile si tout ce que vous voulez, c'est détecter l'hôte contre l'adresse. De même, si une adresse est écrite dans un format légèrement différent mais valide (commun à IPv6), une comparaison des chaînes sur les résultats de InetAddress.getByName ne fonctionnera pas.

La bibliothèque Java IPAddress le fera. Le javadoc est disponible sur le lien. Disclaimer: Je suis le chef de projet.

static void check(HostName host) {
    try {
        host.validate();
        if(host.isAddress()) {
            System.out.println("address: " + host.asAddress());
        } else {
            System.out.println("host name: " + host);
        }
    } catch(HostNameException e) {
        System.out.println(e.getMessage());
    }
}

public static void main(String[] args) {
    HostName host = new HostName("1.2.3.4");
    check(host);
    host = new HostName("1.2.a.4");
    check(host);
    host = new HostName("::1");
    check(host);
    host = new HostName("[::1]");
    check(host);
    host = new HostName("1.2.?.4");
    check(host);  
}

Sortie:

address: 1.2.3.4
host name: 1.2.a.4
address: ::1
address: ::1
1.2.?.4 Host error: invalid character at index 4
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top