Domanda

Quindi hai una stringa che viene recuperata da un'interfaccia utente Web di amministrazione (quindi è sicuramente una stringa).Come puoi scoprire se questa stringa è un indirizzo IP o un nome host in Java?

Aggiornamento:Penso di non essere stato chiaro, stavo più chiedendo se c'è qualcosa nell'SDK Java che posso usare per distinguere tra IP e nomi host?Ci scusiamo per la confusione e grazie a tutti coloro che si sono presi/si prenderanno il tempo per rispondere a questa domanda.

È stato utile?

Soluzione

Puoi utilizzare un'espressione regolare con questo modello:

\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

Questo ti dirà se si tratta di un indirizzo IPv4.

Altri suggerimenti

Possiamo supporre che sia così È l'uno o l'altro e non qualcosa di completamente diverso?Se è così, probabilmente utilizzerei una regex per vedere se corrispondeva al formato "quad punteggiato".

Puoi vedere se la stringa corrisponde al formato numero.numero.numero.numero, ad esempio:

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

corrisponderà a qualsiasi cosa da 0 - 999.

Qualsiasi altra cosa puoi impostarla come nome host predefinito.

URI validator = new URI(yourString);

Tale codice convaliderà l'indirizzo IP o il nome host.(Genera un'eccezione URI non valida se la stringa non è valida)

Se stai cercando di distinguere i due... allora mi manca leggere la tua domanda.

Non potresti semplicemente creare una corrispondenza regexp su di esso?

Puoi utilizzare un gestore della sicurezza con il file InetAddress.getByName(addr) chiamata.

Se l'indirizzo non è un quadruplo tratteggiato, getByName tenterà di eseguire una connessione per eseguire la ricerca del nome, che il responsabile della sicurezza può acquisire come file checkConnect(addr, -1) chiamata, risultando in una SecurityException lanciata che puoi intercettare.

Puoi usare System.setSecurityManager() se stai utilizzando tutti i privilegi, inserisci il tuo gestore della sicurezza personalizzato prima del getByName viene effettuata la chiamata.

Non è così semplice come può sembrare, ci sono alcune ambiguità riguardo a caratteri come trattini, trattini bassi e parentesi quadre '-', '_', '[]'.

Java SDK presenta alcune limitazioni in quest'area.Quando si utilizza InetAddress.getByName uscirà sulla rete per eseguire una risoluzione dei nomi DNS e risolvere l'indirizzo, il che è costoso e non necessario se tutto ciò che desideri è rilevare host e indirizzo.Inoltre, se un indirizzo è scritto in un formato leggermente diverso ma valido (comune in IPv6), eseguire un confronto tra stringhe sui risultati di InetAddress.getByName non funzionerà.

La libreria Java IPAddress lo farà.Il javadoc è disponibile al link.Disclaimer:Sono il responsabile del progetto.

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

Produzione:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top