Pergunta

Então você tem uma String que é recuperada de uma UI web administrativa (então é definitivamente uma String).Como você pode descobrir se esta string é um endereço IP ou um nome de host em Java?

Atualizar:Acho que não fui claro, estava mais perguntando se há algo no Java SDK que eu possa usar para distinguir entre IPs e nomes de host.Desculpe pela confusão e obrigado a todos que dedicaram/dispensarão um tempo para responder a isso.

Foi útil?

Solução

Você pode usar uma expressão regular com este padrão:

\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

Isso lhe dirá se é um endereço IPv4.

Outras dicas

Podemos fazer a suposição de que é um ou outro, e não algo completamente diferente?Nesse caso, provavelmente usaria um regex para ver se correspondia ao formato "quadrado pontilhado".

Você pode ver se a string corresponde ao formato número.número.número.número, por exemplo:

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

combinará com qualquer coisa de 0 - 999.

Qualquer outra coisa você pode definir como padrão o nome do host.

URI validator = new URI(yourString);

Esse código validará o endereço IP ou nome do host.(Ele lança uma exceção de URI malformada se a string for inválida)

Se você está tentando distinguir os dois ... sinto falta de ler sua pergunta.

Você não poderia simplesmente fazer uma correspondência de regexp nele?

Você pode usar um gerenciador de segurança com o InetAddress.getByName(addr) chamar.

Se o endereço não for um quadrante pontilhado, getByName tentará realizar uma conexão para fazer a pesquisa de nome, que o gerente de segurança pode capturar como um checkConnect(addr, -1) chamada, resultando em uma SecurityException lançada que você pode capturar.

Você pode usar System.setSecurityManager() se você estiver executando com total privilégio para inserir seu gerenciador de segurança personalizado antes do getByName chamada é feita.

Não é tão simples quanto pode parecer, existem algumas ambigüidades em torno de caracteres como hífens, sublinhado e colchetes '-', '_', '[]'.

O Java SDK tem algumas limitações nesta área.Ao usar InetAddress.getByName ele irá para a rede para fazer uma resolução de nome DNS e resolver o endereço, o que é caro e desnecessário se tudo o que você deseja é detectar host versus endereço.Além disso, se um endereço for escrito em um formato ligeiramente diferente, mas válido (comum em IPv6), fazer uma comparação de strings nos resultados de InetAddress.getByName não funcionará.

A biblioteca Java IPAddress farei isso.O javadoc está disponível no link.Isenção de responsabilidade:Eu sou o gerente do projeto.

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

Saída:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top