2013-12-11 5 views
14

Ich habe eine lokale IP-Adresse in Schreibweise mit Dezimaltrennzeichen in einem String. Ich möchte es in eine InetAddress konvertieren, um es zu Socket zu füttern, aber ich muss es tun, ohne einen DNS-Lookup zu tun (weil dies zu langen Timeouts führen könnte).Konvertieren eines Strings in InetAddress ohne DNS-Lookup

Gibt es eine fertige Methode dafür, oder muss ich die String teilen und die InetAddress aus ihren Bytes erstellen?

aktualisieren Die Fabrikmethoden InetAddress.getByName() und InetAddress.getByAddress() scheinen nicht eine gute Passform zu sein, da sie auch beide Host-Namen akzeptieren wie java.sun.com. Es ist nicht zu sagen, ob sie versuchen werden, einen DNS-Server in ihrer Implementierung zu kontaktieren.

+0

möglich Duplikat [? Gibt es eine einfache Möglichkeit, String zu InetAddress in Java zu konvertieren] (http://stackoverflow.com/questions/2309049/is-there-ein-easy-to-convert-string-in-inetadresse-in-java) – Zelldon

+0

@Zelldon, einverstanden. Ich möchte jedoch nicht nur eine ganze Bibliothek für diese Funktionen verwenden. –

+0

http://stackoverflow.com/questions/5571744/java-convert-a-string-representting-an-ip-to-inetaddress auch die gleiche Frage – Zelldon

Antwort

13

wie diese

InetAddress inetAddress = InetAddress.getByName("192.168.0.105"); 

tun, wenn eine wörtliche IP-Adresse geliefert wird, nur die Gültigkeit der Adresse Format geprüft.

Java-Quellcode

// if host is an IP address, we won't do further lookup  
if (Character.digit(host.charAt(0), 16) != -1 || (host.charAt(0) == ':')) { 

} 
+0

Ist garantiert, dass kein DNS läuft (auch kein Reverse DNS oder was auch immer)? –

+1

@BartFriederichs Laut einem Java-Dokument gibt es keine DNS-Verifizierung, wenn das korrekte IP-Format angegeben ist. Referenz - http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName%28java.lang.String%29 – Prabhakaran

+4

Quellcode sagt das gleiche: 'wenn Host eine IP ist Adresse, wir werden nicht weiter suchen ' –

0

Sie können dies tun, indem Sie die Methode getByName. Zum Beispiel:

InetAddress localhost = InetAddress.getByName("127.0.0.1") 

wie es auf der Java-Dokumentation beschrieben ist:

Der Hostname kann entweder einen Maschinennamen, wie „java.sun.com“ sein oder eine textuelle Repräsentation seine IP-Adresse. Wenn eine wörtliche IP-Adresse angegeben wird, wird nur die Gültigkeit des Adressformats überprüft.

+0

In meinem Fall InetAddress Adresse = InetAddress.getByName ("www.sun.com"); läuft richtig, aber wenn ich eine falsche Adresse als Argument wie "www.sunqqq.com" gebe, gab es Ausnahmen. >>> java.net.UnknownHostException: www.sunqqq.com unter java.net.Inet6AddressImpl.lookupAllHostAddr (Native Methode) unter java.net.InetAddress $ 1.lookupAllHostAddr (Unbekannte Quelle) unter java.net.InetAddress.getAddressesFromNameService (Unbekannte Quelle) bei java.net.InetAddress.getAllByName0 (unbekannte Quelle) bei java.net.InetAddress.getAllByName (unbekannte Quelle) .... (mehr) - –

+0

Also bedeutet es, dass getByName() Methode die DNS-Überprüfungen tun ??? Wie es scheint die Gültigkeit der Host-Adresse auch überprüft haben ??? –

+0

Ja. Wenn Sie getByName einen Hostnamen geben, führen Sie eine DNS-Suche durch. Wenn jedoch eine IP-Adresse angegeben wird, wird nur die Gültigkeit der IP-Adresse (Zeichenfolgenformat) überprüft. – Ali

3

Sie können Guava's InetAddresses#forString() verwenden, die speziell für Ihren Anwendungsfall dokumentiert ist:

Gibt die InetAddress die angegebene String-Darstellung mit.
Dies vermeidet bewusst alle Nameservice-Lookups (z. B. kein DNS).

(Hervorhebung hinzugefügt)

0

The open-source IPAddress Java library werden alle gängigen Darstellungen von IPv6 und IPv4 validieren und wird dies tun, ohne DNS-Lookup. Haftungsausschluss: Ich bin der Projektleiter dieser Bibliothek.

wird der folgende Code tun, was Sie fordern:

 String str = "fe80:0:0:0:f06c:31b8:cd17:5a44"; 
     try { 
      IPAddressString str = new IPAddressString(str); 
      IPAddress addr = str.toAddress();//throws if invalid, without a DNS lookup 
      InetAddress inetAddr = addr.toInetAddress();//convert valid address 
      //use address 
     } catch(AddressStringException e) { 
      //e.getMessage has validation error 
     }