2013-01-03 3 views
0

왜 UnknownHostException을 throw합니까?UnknownHostException

parameters = "user=akirus&pass=1234&version=1"; 
    String result = excutePost("http://russianimperial.ru/minecraft/loginServer.php", parameters); 

    public static String excutePost(String targetURL, String urlParameters) { 
     HttpURLConnection connection = null; 
     try { 
      URL url = new URL(targetURL); 
      connection = (HttpURLConnection)url.openConnection(); 

      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length)); 
      connection.setRequestProperty("Content-Language", "en-US"); 

      connection.setUseCaches(false); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 

      DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
      wr.writeBytes(urlParameters); 
      wr.flush(); 
      wr.close(); 

      InputStream is = connection.getInputStream(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

      StringBuffer response = new StringBuffer(); 
      String line; 
      while ((line = rd.readLine()) != null) { 
       response.append(line); 
       response.append('\r'); 
      } 
      rd.close(); 

      String str1 = response.toString(); 
      return str1; 
    }catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    }finally { 
     if (connection != null) 
      connection.disconnect(); 
    } 
    } 

url http://russianimperial.ru/minecraft/loginServer.php이 유효합니다. 더 빨리 작동합니다. 이 자리에 UnknownHostException이 던졌습니다. InputStream is = connection.getInputStream();. 은 javadoc에서 connection.getInputStream() 프로토콜이 입력을 지원하지 않을 때이 예외를 throw 할 수 있지만 http 지원 입력이라고 생각합니다. JavaDoc에서

+2

'getInputStream'이 포기하지 않는 실행하는'UnknownHostException' ... –

+2

@OliCharlesworth 'UnknownHostException'는'IOException'의 서브 클래스이고'getInputStream()'은 그것을 던져 버리기로 선언합니다. – jlordo

+0

@jlordo : 아, 네 말이 맞아! –

답변

2

봐 :

UnknownHostException의는

호스트의 IP 주소가 될 수 없다는 것을 나타 내기 위해서 (때문에) 슬로우됩니다 는 SO 질문을하기 전에

을 수행

을 결정했다.

+0

하지만 IP를 확인할 수없는 이유를 이해할 수 없습니까? – Akirus

+0

당신은 ping russianimperial.ru가 잘 작동하는 것을 볼 수 있습니다. [link] (http://higgs.rghost.ru/42699600/image.png) – Akirus

+0

@ user1945186 많은 이유가 있습니다. 귀하의 질문에 대한 전체 스택 추적을 제공 할 수 있습니까? – jlordo

1

실제로이 코드는 UnknownHostException을 생성합니다.

java.net.UnknownHostException: updaters 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:195) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
    at java.net.Socket.connect(Socket.java:529) 
    at java.net.Socket.connect(Socket.java:478) 
    at sun.net.NetworkClient.doConnect(NetworkClient.java:163) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:388) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:523) 
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:227) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:300) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:317) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836) 
    at sun.net.www.protocol.http.HttpURLConnection.followRedirect(HttpURLConnection.java:2113) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1367) 
    at Host.excutePost(Host.java:43) 
    at Host.main(Host.java:14) 

당신은 URL 연결을 재 시도 할 때이 예외를 얻고, 리디렉션 일부 불분명 '업데이터'로 이동 :하지만 전체 스택 트레이스를 보라. 그래서 'russianimperials.ru'가 아니라 리다이렉트입니다. 왜? 그것은 페이지에 달려 있습니다. 매개 변수를 전달하는 방법에 뭔가 잘못되어있을 수도 있습니다. 클라이언트와 서버 사이의 교환을 보면

+0

내 스크립트에서 실수를했습니다. 나는 $ _GET [..]을 $ _POST [...]로 대체하지 않았습니다. – Akirus

0

, 당신이 찾을 : 당신이 사용자 에이전트, 또는 설정없이 사용자 에이전트를 변경하는 경우

* Request 
GET/HTTP/1.1 
Host: russianimperial.ru 
User-Agent: Java/1.6.0_26 

* Response 
HTTP/1.1 302 Found 
Server: nginx/0.8.55 
Date: Thu, 03 Jan 2013 11:45:08 GMT 
Content-Type: text/html; charset=iso-8859-1 
Connection: keep-alive 
Location: http://updaters/tds/go.php?sid=1 
Content-Length: 286 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>302 Found</title> 
</head><body> 
<h1>Found</h1> 
<p>The document has moved <a href="http://updaters/tds/go.php?sid=1">here</a>.</p> 
<hr> 
<address>Apache/2 Server at russianimperial.ru Port 80</address> 
</body></html> 

,를 들어, 거기에는 재 없지만 알 수없는 이유로, 자바 사용자 에이전트가이 사이트에서 차단되지 않은 기존 호스트

변경 사용자 에이전트를 향해 재, 모든 원활

+0

교환 방법을 살펴 보는 방법, 요청 및 응답에서 어떻게 찾을 수 있습니까? –

+1

사용하는 HTTP 클라이언트에 따라 몇 가지 옵션이 있습니다. Chrome 또는 Firefox 개발자 도구에서 헤더를 검사 할 수 있습니다. 리눅스에서는'curl' 도구를'curl -v http : //website.to.test -o/dev/null'과 함께 사용할 수도 있습니다. Linux의 또 다른 도구는 GUI 도구 인'wireshark' (또는 커맨드 라인 couterpart의 경우'tcpdump ')입니다. 이 모든 도구를 사용하면 요청에 헤더를 검사 할 수 있습니다. – Grooveek

+0

Grooveek에 감사드립니다. –