Newsgroup: it.comp.java
Titolo: Verificare se una stringa è un indirizzo IP corretto

Il seguente frammento di codice legge dal file IP.txt una riga, verificando 
che contenga un indirizzo IP, e lo assegna alla variabile IP. In caso 
contrario ad IP viene assegnato il valore "127.0.0.1" (localhost).
Il tutto funziona correttamente, solo volevo sapere: si puň effettuare 
questo controllo in modo piů rapido? Magari con qualche metodo di 
java.net
? 
Il risultato deve essere valutato come corretto solo se si tratta di un 
indirizzo IP (4 numeri tra 0 e 255 separati da punti), e non di qualcosa 
tipo 
www.google.it
.
String IP="127.0.0.1";
try
 {
  BufferedReader file=new BufferedReader(new FileReader("./IP.txt"));
  String IPletto=file.readLine();
//qui inizia il controllo: si tratta di in indirizzo IP?
  String parte_IP=IPletto;
  for (int i=1;i<4;i++)
   {
    int b=parte_IP.lastIndexOf(".");
    if (b<0) {throw new NumberFormatException("");}
    int n=Integer.parseInt(parte_IP.substring(b+1,parte_IP.length()));
    if ((n<0)||(n>255)) {throw new NumberFormatException("");}
    parte_IP=parte_IP.substring(0,b);
    if (i==3)
     {
      n=Integer.parseInt(parte_IP);
      if ((n<0)||(n>255)) {throw new NumberFormatException("");}
     }
   }
//fine controllo
  IP=IPletto;
  file.close();
 }
catch (IOException e) {}
catch (NumberFormatException e) {}

Non è una soluzione precisissima ma puoi provare a collegarti a quell'IP con 
un socket: in caso l'operazione abbia successo l'IP è valido e lo assegni 
alla variabile, altrimenti gli assegni localhost nel relativo catch.
So che per 1000 motivi non è una soluzione esatta ed elegante, ma se devi 
fare in fretta questo può essere un metodo efficace...
Ciao,
   Ste 

 fare in fretta questo puň essere un metodo efficace...
Ti ringrazio per la proposta; ma mi rovina tutta l'indentazione; in questo 
caso preferisco la mia soluzione (le righe quando non mi serviranno piů le 
tolgo in blocco, e via). Io speravo in qualcosa tipo
 if (!nomeclasse.IPcorretto) {IP="127.0.0.1"}
In fondo, l'importante č che funzioni... 

Shannon diceva che tutto si può fare... e aveva ragione!!!
Considera il codice seguente:
import java.io.*;
import java.net.*;
...
public boolean IPcorretto() {
// suppongo che da qualche parte in "nomeclasse"
// sia stato salvato l'ip da testare, ad esempio in una
// variabile di nome "address"...
// ... e magari anche una porta in "port"!
   boolean valid = true;
   Socket socket = null;
   try {
      socket = new Socket (address, port);
      socket.close();
   } catch (IOException e) {
      valid = false;
   }
   result valid;
}
Trovo sia più elegante il codice seguente:
import java.io.*;
import java.net.*;
...
public void assignIP (String ip) {
// suppongo sempre di memorizzare l'ip in una variabile
// di nome "address" e che ci sia una variabile intera
// "port" per la porta...
   Socket socket = null;
   address = ip;
   try {
      socket = new Socket (address, port);
      socket.close();
   } catch (IOException e) {
      address = "127.0.0.1"; // o "localhost";
   }
}
I problemi grossi sono due:
* devi conoscere a priori la porta a cui collegare il socket per il test (ma 
magari se ti appoggi al servizio "echo" non è un grosso problema, ma se sul 
computer remoto è stato disattivato quel servizio in particolare, l'ip che 
provi risulta erroneamente non valido);
* i socket sono risorse molto preziose nell'economia della rete quindi per 
non appesantire inultimente il traffico è buona norma non aprire e chiudere 
socket senza motivo. questo in linea di massima... vedi tu!
Ciao,
   Stefano
Il grosso problema è che devi conoscere a priori la porta a cui collegare il 
socket per il test (ci deve essere un'interfaccia server in ascolto) e 
comunque aprire e chiudere un socket sono operazioni molto costose ed è 
buona norma utilizzare 


http://csvtosql.sf.net

guarda anche qui
http://tinyurl.com/dvuc8


 questo controllo in modo piů rapido? 
con le regex fai in un batter d'occhio. 
Il pezzo di codice sotto sembra complicato solo perchč c'č il check per il
<255 fatto in java, ma si puň far fare anche quel lavoro alla regex
(complicandola) e dunque ridurre il tutto a una riga di codice
ip.matches(validIp)
prova con la regex che ti hanno mandato in un altro post. In ogni caso
l'approccio corretto per un task del genere, sempre che non si trovi una
classe in 
java.net
 che lo fa per te, č usare le regex. 
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class IPMatcher {
  public static boolean isValid(String ip) {
    Matcher ipCandidate = validIp.matcher(ip);
    if (ipCandidate.find()) {
      int first = Integer.parseInt(ipCandidate.group(1));
      int second = Integer.parseInt(ipCandidate.group(2));
      int third = Integer.parseInt(ipCandidate.group(3));
      int fourth = Integer.parseInt(ipCandidate.group(4));
      return (first<255) && (second<255) && (third<255) && (fourth<255) ;
    } else {
      return false;
    }
  }
  public static void main(String[] args) {
    //bboni
    System.out.println(isValid("10.0.0.1"));
    System.out.println(isValid("192.168.1.100"));
    // no bboni
    System.out.println(isValid("192.256.1.101"));
    System.out.println(isValid("1024.0.0.1"));
    System.out.println(isValid(".1.0.0.1"));
    System.out.println(isValid("10.0.0.1."));
  }
  private static final Pattern validIp =
Pattern.compile("^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$");
}
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it