2013-12-11 16 views
14

Mam lokalny adres IP w notacji dziesiętnej z kropkami w String. Chcę przekonwertować go na InetAddress, aby przesłać go do Socket, ale muszę to zrobić bez wykonywania wyszukiwania DNS (ponieważ może to spowodować długie limity czasu).Konwertuj ciąg na InetAddress bez wyszukiwania DNS

Czy jest na to gotowa metoda, czy też trzeba podzielić String i utworzyć InetAddress z jego bajtów?

Aktualizacja Metody fabryczne InetAddress.getByName() i InetAddress.getByAddress() nie wydaje się być dobrym rozwiązaniem, ponieważ zarówno przyjąć również hostów takich jak java.sun.com. Nie ma żadnego powiedzenia, czy spróbują skontaktować się z serwerem DNS podczas implementacji.

+0

możliwe duplikat [? Czy istnieje prosty sposób przekonwertować ciąg do InetAddress Java] (http://stackoverflow.com/questions/2309049/is-there-an-easy-way-to-convert-string-to-inetaddress-in-java) – Zelldon

+0

@Zelldon, uzgodniono. Nie chcę jednak używać całej biblioteki tylko dla tych funkcji. –

+0

http://stackoverflow.com/questions/5571744/java-convert-a-string-representing-an-ip-to-inetaddress również to samo pytanie – Zelldon

Odpowiedz

13

Czy podoba Ci się ta

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

Jeśli dosłownym adres IP jest dostarczany tylko ważność formacie adresu jest zaznaczone.

kod źródłowy Java

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

} 
+0

Czy jest zagwarantowane, że DNS nie będzie działał (także bez odwrotnego DNSa czy cokolwiek innego)? –

+1

@BartFriederichs Zgodnie z dokumentem Java nie ma weryfikacji DNS, jeśli dostarczono poprawny format IP. Odnośnik - http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName%28java.lang.String%29 – Prabhakaran

+4

Kod źródłowy mówi to samo: "jeśli host jest adresem IP adres, nie będziemy więcej szukać " –

0

Można to zrobić za pomocą metody getByName. Np

InetAddress localhost = InetAddress.getByName("127.0.0.1") 

Jak opisano w Dokumentach JAVA:

Nazwa gospodarza może być albo nazwę komputera, na przykład „java.sun.com” lub reprezentacji tekstowej jego adres IP. Jeśli zostanie podany dosłowny adres IP, sprawdzana jest tylko ważność formatu adresu.

+0

W moim przypadku adres InetAddress = InetAddress.getByName ("www.sun.com"); działa poprawnie, ale kiedy podaję zły adres hosta jako argument, taki jak "www.sunqqq.com", podano wyjątki. >>> java.net.UnknownHostException: www.sunqqq.com na java.net.Inet6AddressImpl.lookupAllHostAddr (metoda macierzysta) na java.net.InetAddress $ 1.lookupAllHostAddr (Nieznane źródło) na java.net.InetAddress.getAddressesFromNameService (Nieznane źródło) na java.net.InetAddress.getAllByName0 (Nieznane źródło) na java.net.InetAddress.getAllByName (Nieznane źródło) .... (więcej) - –

+0

Czy to oznacza, że ​​metoda getByName() przeprowadza kontrole DNS? Jak się wydaje, poprawność adresu hosta również została sprawdzona? –

+0

Tak. jeśli podasz nazwę hosta do getByName, przeprowadzi on wyszukiwanie DNS. ale jeśli podany jest adres IP, sprawdza tylko ważność adresu IP (format ciągu). – Ali

3

Można użyć Guava's InetAddresses#forString() który jest specjalnie dla udokumentowany przypadek użycia:

Zwraca InetAddress mając daną reprezentację ciąg.
Celowo unika wszystkich wyszukiwań nazw (np. Brak DNS).

(podkreślenie dodane)

0

The open-source IPAddress Java library zweryfikuje wszystkie standardowe reprezentacje IPv6 i IPv4 i zrobi to bez wyszukiwania DNS. Zastrzeżenie: jestem kierownikiem projektu tej biblioteki.

Poniższy kod zrobi co prosisz:

 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 
     }