Validar IP com java

olá pessoal

eu pretendo colocar no meu aplicativo um JTextField para que o
usuário insira um número de IP(ele vai ter que digitar os pontos e
tudo)… daí eu gostaria de pegar essa string e validar para ver se
o usuário não escreveu bobeira…
existe função em java que faz isso ?

bom, então é isso ! valeu !
Dennis

Olá

Porque não usa métodos do servlet para pegar o IP do usuário ao invés de pedir para ele digitar? E se for aplicação desktop você pode pegar de vários modos, um deles com algo tipo ipconfig.

[]s
Luca

estou trabalhando como estagiário na programação de um jogo multiplayer
no servidor preciso configurar o IP do session host que fará
a ligação entre o servidor e o cliente… como pode existir
muitos session hosts, eu gostaria de poder digitar o ip do session host
para informar ao servidor onde o session host está

Ué, tu quer valdiar um IP?


if(segmento<0 || segmento>255) return false

faça um for para o número de segmentos da sua classe.

[]s

Faça uma expressão regular, acho que isso basta:

[0-9][0-9][0-9][.][0-9][0-9][0-9][.][0-9][0-9][0-9]

Tá tosco (pode ser melhorada), mas já ajuda.

oi danieldestro

eu sou completamente iniciante em java…
por isso gostaria que vc explicasse melhor como que usa
essa expressão regular

bom, é isso ! valeu !
Dennis

[quote=“danieldestro”]Faça uma expressão regular, acho que isso basta:

[0-9][0-9][0-9][.][0-9][0-9][0-9][.][0-9][0-9][0-9]

Tá tosco (pode ser melhorada), mas já ajuda.[/quote]

Uhm…aí tu permite 999.999.999.999

[]s

Olá

Agora que você explicou posso responder com mais certeza: a menos que seus clientes estejam atrás de um proxy não é necessário pedir que digitem o endereço IP. Você pode obter isto com facilidade usando o método getRemoteAddr da classe ServletRequest e armazenar esta informação no objeto session.

Atrás de proxies o negócio fica mais difícil, as vezes quase impossível. Alguns proxies completam o request com um header tipo “X-Forwarded” ou “X-Forward-IP” ou algo similar. Este header contém o IP “real”. Já se o cara estiver atrás de um proxy anônimo então babau. só perguntando mesmo e ele vai responder qq coisa menos o IP dele.

[]s
Luca

danieldestro,

consegui testar sua dica, usando a expressão regular

[0-2][0-5][0-5][.][0-2][0-5][0-5][.][0-2][0-5][0-5][.][0-2][0-5][0-5]

mas o problema é que ele não valida o ip se o usuário digitar
algo como 192.168.0.1, somente Ips como 255.255.255.255

bom, então é isso ! valeu !
Dennis

Denis, acho que o melhor é 0< IP =< 255 mesmo. Por regexp acho que nao dá.

[]s

[code]import java.util.regex.*;

public class Teste {
public static void main( String[] args ) {
String ip = “10.100.0.1”;
String regex = “\d?\d?\d[.]\d?\d?\d[.]\d?\d?\d[.]\d?\d?\d”;
Pattern pattern = Pattern.compile( regex );
Matcher matcher = pattern.matcher( ip );
if( matcher.matches() ) {
System.out.println( “IP válido” );
}

  // na versã jdk 1.4.2
  if( ip.matches( regex ) ) {
	  System.out.println( "IP válido" );
  }

}
}[/code]

[quote=“danieldestro”] String regex = "d?d?d[.]d?d?d[.]d?d?d[.]d?d?d";[/quote]

Imrpessão minha ou isso permitira 999.999.999.999 [não to com ambiente pra testar :frowning: ]?

[]s

[quote=“denakitan”]danieldestro,

consegui testar sua dica, usando a expressão regular

[0-2][0-5][0-5][.][0-2][0-5][0-5][.][0-2][0-5][0-5][.][0-2][0-5][0-5]

mas o problema é que ele não valida o ip se o usuário digitar
algo como 192.168.0.1, somente Ips como 255.255.255.255

bom, então é isso ! valeu !
Dennis[/quote]

tente usar interrogação, algo tipo:

[0-2]?[0-5]?[0-5][.][0-2]?[0-5]?[0-5][.][0-2]?[0-5]?[0-5][.][0-2]?[0-5]?[0-5]

pcalcado… aquel que eu postei vai aceitar 999 sim…

Yeap, permitiria. Destro, para de chutar cachorro morto! :smiley:

A regex mais “correta” que eu consegui pensar aqui seria:

(([0-1]?[0-9]{1,2}\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))

hehehehe… minha abstração com regex não vai mto longe.

Livro bom sobre o assunto: http://guia-er.sourceforge.net/

Marcio Kuchma

Bom, deixa eu tentar tambem, preferiria criar uma regex mais simples como:

Pattern pattern = Pattern.compile("(\d{1,3}\.){3}\d{1,3}");
E se passar por ela usar o split para validar cada seguimento. No mais, se sua aplicação desktop vai pegar o endereço do host do cliente, o java.net.InetAddress resolve pra vc. Dá uma olhada nas docs. :wink:

valeuz…

Humm gostei da forma q o ganza fez…mas pow é via TextField a passagem de parâmetros né?Não fica as vezes mais fácil fazer um JFormattedTextField e receber cada pedacinho da máscara como uma stringzinha a ser tratada? (aí o primeiro exemplo do Philip seria o mais simples e tranquilo de se fazer!)

use este código:

InetAddress host;

try {
host = ip;
}
catch(UnknownHostException uhex) {
System.out.println(“Host Inválido”);
}

Pessoal,

fiz um método estático que me serviu. Espero que ajude vocês.

/**
     * Verifica se um endereço IP é válido
     * @param ipAddress String contendo o endereço IP a ser testado
     * @return TRUE caso o IP seja válido e FALSE caso seja inválido
     */
    public static boolean isEnderecoIpValido(String ipAddress)  {
        
        //Checa se o comprimento da string é menor que 6 e maior que 15
        //Minimo 1.1.1.1 Máximo 255.255.255.255
        if (ipAddress.length()<6 || ipAddress.length()>15)   {
            return false;
        }
        
        //Quebrando a string em array pelo símbolo . deve ser gerado um array 
        //com 4 itens
        String[] itens = ipAddress.split(".");
        
        if (itens.length != 4)  {
            return false;
        }
        
        boolean retorno = true;
        try {
            for (String item: itens)    {
                if (Integer.parseInt(item)<1 || Integer.parseInt(item)>255) {
                    retorno = false;
                }
            }
        //Exception capsulada pois o objetivo do método é só testar o endereço    
        } catch (NumberFormatException ex)  {
            retorno = false;
        }
        
        return retorno;

    }

Abs!

Jefferson