2011-08-02 23 views
5

Próbuję rozwiązać nazwę hosta na odpowiadający jej adres IP.InetAddress.getByName nie powiedzie się za serwerem proxy

Moje środowisko to komputer typu mac w sieci firmowej za serwerem proxy, który jest skonfigurowany za pomocą pliku .pac za pośrednictwem preferencji systemowych (automatyczna konfiguracja serwera proxy). Jak dotąd wszystko działa dobrze i mogę uzyskać dostęp do zasobów wewnątrz i na zewnątrz mojej sieci firmowej.

Rozwiązywanie komputerów znajdujących się w mojej sieci działa perfekcyjnie: InetAddress.getByName("host.local");

Ale kiedy używać nazw hostów zewnętrznych, otrzymuję UnknownHostException: InetAddress.getByName("google.com");

produkuje

Exception in thread "main" java.net.UnknownHostException: google.com 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:850) 
    at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1201) 
    at java.net.InetAddress.getAllByName0(InetAddress.java:1154) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1084) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1020) 
    at java.net.InetAddress.getByName(InetAddress.java:970) 
    at Test.main(Test.java:67) 

(jestem trochę zaskoczony tutaj Inet6AddressImpl)

O ile rozumiem, InetAddress.getByName używa mechanizmów macierzystych do rozpoznawania nazw hostów. Tak więc nie sądzę, że błąd jest spowodowany brakującą konfiguracją proxy w java jvm.

Ale co jeszcze może być, jeśli wszystko inne działa dobrze?

Niektórzy (być może) użyteczna informacja dodatkowa:

  • używam MacBooka, ifconfig pokazuje interfejsy lo0, gif0, stf0, en0, fw0, EN1 -> podłączony do sieci z IPv4 adres.

  • nslookup google.com na konsoli zwraca ** server can't find google.com: NXDOMAIN

  • tego samego kodu na komputerze z systemem Windows w sieci wyprodukował sam wyjątek

Wszelkie pomysły na temat przyczyny tego błędu? Czy istnieją inne sposoby na rozwiązywanie nazw hostów w java?

Odpowiedz

5

Twój firmowy serwer DNS uniemożliwia rozstrzygnięcie dowolnej domeny interentowej (prawdopodobnie nie chcą, aby użytkownicy przeglądali kontekst poza firmowy).

Jest to obsługiwane przez niepowodzenie zapytania nslookup.

Jeśli nie głosujesz na politykę korporacyjną, a Twoja maszyna deweloperska musi pozostać na terenie firmy, nic nie możesz zrobić.

+0

Dzięki za odpowiedź Alexander. Nie jestem ekspertem od sieci, ale czy to nie znaczy, że nie mogę uzyskać dostępu do witryny google.com (i oczywiście tej witryny;) z poziomu sieci firmowej? Wiem, że plik pac definiuje reguły, kiedy należy korzystać z serwera proxy, a kiedy nie. Może problem związany z "wykonaniem" pac na żądanie od jvm? – Benjamin

+1

Alexander jest poprawny. Twój ruch trafia do Google, wysyłając go do serwera proxy, który sprawdza DNS przed wysłaniem ruchu na serwer Google. – EricLaw

+0

@Benjamin. Jeśli możesz przejść do strony "google.com" za pomocą przeglądarki firmowej, być może musisz skonfigurować proxy dla swojego programu java. Aby uzyskać pomoc, przeczytaj ten artykuł: http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html –

0

Jak wspomniano w artykule this post, można ustawić niestandardowy DNS przy użyciu ustawienia Tylko Słońce-JVM. Miałem ten sam problem z rozdzielczością, ale byłem w stanie zapytać proxy bezpośrednio o przeszukiwanie, ustawiając go również jako serwer DNS. YMMV

System.setProperty("sun.net.spi.nameservice.nameservers", "<my-proxy-ip>"); 
System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");