2010-03-05 6 views
1

안드로이드 앱에서 실행중인 웹 서버에 연결하려고합니다. 그러나 어떤 이유로 든 실패하고 있습니다.안드로이드에서 HttpURLConnection 사용하기

정상적으로 웹 페이지에 연결할 수 있으며 휴대 전화의 브라우저를 사용하여 아래 코드를 사용하여 Google에 연결할 수 있지만 어떤 이유로 내 코드가 내 웹 서버에 연결되지 않습니다. 8080에 서버를 호스팅하면 오류 코드 503이 매번 발생합니다.이 코드는 8080 (이 방법이 바람직합니다)에 호스트하면 아래의 시간 초과 예외가 발생합니다.

03-05 20:12:22.432: WARN/System.err(29254): java.net.SocketException: The operation timed out 
03-05 20:12:22.602: WARN/System.err(29254):  at org.apache.harmony.luni.platform.OSNetworkSystem.connectSocketImpl(Native Method) 
03-05 20:12:22.602: WARN/System.err(29254):  at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:125) 
03-05 20:12:22.602: WARN/System.err(29254):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:227) 
03-05 20:12:22.612: WARN/System.err(29254):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:521) 
03-05 20:12:22.612: WARN/System.err(29254):  at java.net.Socket.connect(Socket.java:1019) 
03-05 20:12:22.612: WARN/System.err(29254):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:67) 
03-05 20:12:22.612: WARN/System.err(29254):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager$ConnectionPool.getHttpConnection(HttpConnectionManager.java:151) 
03-05 20:12:22.612: WARN/System.err(29254):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionManager.getConnection(HttpConnectionManager.java:73) 
03-05 20:12:22.612: WARN/System.err(29254):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getHTTPConnection(HttpURLConnection.java:826) 
03-05 20:12:22.612: WARN/System.err(29254):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:812) 
03-05 20:12:22.612: WARN/System.err(29254):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:1275) 
03-05 20:12:22.612: WARN/System.err(29254):  at com.project.library.remailer.ServerSelect.downloadDirectory(ServerSelect.java:84) 
03-05 20:12:22.622: WARN/System.err(29254):  at com.project.main.NewMessage$3$1$1.run(NewMessage.java:156) 

코드는 다음과 같습니다

try { 
    URL url = new URL(directoryLocation); 
    HttpURLConnection httpURLConnection = (HttpURLConnection) url 
      .openConnection(); 

    // The line below is where the exception is called 
    int response = httpURLConnection.getResponseCode();     
    if (response == HttpURLConnection.HTTP_OK) { 


     // Response successful 
    InputStream inputStream = httpURLConnection.getInputStream(); 

    // Parse it line by line 
    BufferedReader bufferedReader = new BufferedReader(
       new InputStreamReader(inputStream)); 
    String temp; 
    while ((temp = bufferedReader.readLine()) != null) { 
     // Parsing of data here 
    } 
     } else { 
      Log.e("SAMES", "INCORRECT RETURN CODE: " + response); 
     } 
} catch (MalformedURLException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

나는 내가 이전과 시간 제한 예외를 같은 오류가 포트 8080에 대한 CommonsWare에 의해 제안 된 링크의 코드를하려고하면. 포트 80의 경우 다음 예외가 발생합니다.이 두 가지 오류는 모두 url.openStream()에서 발생합니다.

포트 80 예외 :

I은 ​​또한 다음과 같은 코드를 사용하여 시도
03-06 11:53:53.296: WARN/System.err(639): java.io.FileNotFoundException: http://64.197.194.165:80/path 
03-06 11:53:53.376: WARN/System.err(639):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1064) 
03-06 11:53:53.376: WARN/System.err(639):  at java.net.URL.openStream(URL.java:674) 
03-06 11:53:53.376: WARN/System.err(639):  at com.project.library.remailer.ServerSelect.downloadDirectory(ServerSelect.java:118) 
03-06 11:53:53.376: WARN/System.err(639):  at com.project.main.NewMessage$3$1$1.run(NewMessage.java:156) 

그러나

HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(directoryLocation); 
     try 
     { 
      HttpResponse response = client.execute(request); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
      String line; 
      while((line = reader.readLine()) != null) { 
       Log.e("SAMES", line); 
     } 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 

포트 8080에 대해 동일한 시간 초과 오류가 발생했다 client.execute 때 발생 (응답)이 호출됩니다.

03-06 13시 10분 :

포트 (80)를 들어 나는, 그러나 그것은 페이지에 말했다 중요한 것은 인 HTML 편집을 많이, 연결할 수 없음을 말한다 웹 페이지를 얻을 : 23.576 : 오류/SAMES (1267) : 웹 서버가 다운되었거나, 너무 바빠서, 요청에 응답하지 못하게하는 다른 문제가 발생했을 수 있습니다. 나중에 다시 시도 할 수도 있습니다.

+0

필요한 경우 웹 서버 코드도 제공 할 수 있습니다. 또한 문제가 아니므로 매니페스트에 인터넷을 추가했습니다. –

+0

에뮬레이터를 사용하고 있습니까? – Rintoul

+0

아니요. HTC Hero를 사용하고 있습니다. –

답변

0

url.openConnection()으로 전화 한 후 httpURLConnection.connect()을 호출하면 어떻게됩니까?

+0

나는 이것을 시도하고 여기에 결과가있다. 서버의 포트 80에 연결하려고하면 getResponse90 함수 호출이 발생하고 503 오류가 발생합니다. 포트 8080을 사용하려고하면 connect() 함수 호출시 제한 시간 예외가 발생합니다. –

1

다양한 노트 : 타임 아웃이 발생한 위치를

  • 당신은 표시하지 않습니다.
  • 너와 다른 방식으로 URL을 사용하는 this example을 시도해보십시오.
  • 포트 80의 오류 코드 503은 서버에 유용 할 수있는 오류 정보를 생성해야합니다.
  • 휴대 전화와 웹 서버간에 프록시 서버 또는 다른 것이 있습니까?
  • WiFi와 3G를 모두 사용해 보셨습니까?
  • HttpClient로 전환하여 더 나은 결과가 나오는지 또는 더 나은 오류 메시지가 표시되는지 확인해보십시오.
+0

새 코드를 시도한 것에 대한 응답으로 위 코드를 추가했습니다. 웹 서버에서는 연결이 완료되면 응답을 출력하지만 모든 사람이 위의 시도 중 하나를 연결하고 있다고 말하지 않습니다. HttpClient를 약간 테스트하고 그 결과로 돌아올 것입니다. 또한 3G Atm에만 액세스 할 수 있으며 Wifi에서의 테스트는 어려울 것입니다. 내가 아는 한 내 전화기와 웹 서버 사이에는 프록시 서버가 없습니다. –

+0

휴대 전화와 휴대 전화 사이에 프록시 서버가있을 수 있습니다. 아마도, 다소 특이한 점을 발견 할지라도, 그들은 8080 포트를 지원하지 않을 수도 있습니다. 특히 포트 80 테스트의 경우 서버가 실제로 히트를 등록하는지 확인하십시오. FWIW, 나는 HttpClient로 텍스트 응답을위한 ResponseHandler 패턴을 추천 할 것이다. – CommonsWare

+0

포트에 관계없이 웹 페이지에 액세스 할 수있는 전화의 일반 브라우저를 사용할 때와 같은 방식으로 프록시가 있다고 생각하지 않습니다. 그래서 내 코드에 문제가있을 것입니다. –

-2

루트 권한이있는 앱만 1024 이하의 포트를 열 수 있습니다. 이는 포트 80의 문제입니다.

+1

서버용입니다. 그는 서버를 쓰고 있지 않습니다. 그렇지 않으면 모든 앱에 루트 권한이 있다는 의미 일 것입니다. – bos

1

귀하의 문제는 너무 복잡하여 (제 의견으로는) 완전히 해결하기 위해 최근에 겪어 왔던 문제에 대한 조사 결과를 알려 드리고자합니다. 귀하의 의견에 정확히 설명하신 내용이 원인이었습니다.

모든 유효한 URL에 모든 시간, 그래서 문제가 코드에 있었다 분명했다 - - 당신이 같은 보았다 - 코드의 동일한 조각 내 클래스 중 하나에 IOException을 원인이
// The line below is where the exception is called 
int response = httpURLConnection.getResponseCode(); 

간단하고, 더 헤더가 설정되어 있지, 튜토리얼 위의 예는 없습니다. 나는 내가 본 모든 예제가 심지어 URLConnection.connect() 메서드를 호출하지 않는다는 것을 알아 차 렸습니다. 그래서 나는 실제 연결이 언제 생깁니 까? 표준 HttpURLConnection의 사용 패턴은 어떤 모양입니까?

불행히도 해당 항목에 대한 설명서가 부족합니다. 그래서 내가 검색 좀 했어이 블로그 게시물을 발견 : HttpURLConnection's Dark Secrets - by Tim Bray 더 복잡한 HttpURLConnection 사용 - ceses 작성에 귀중한했다. 또한 내 문제에 대한 대답을 제공했습니다. 관련 전화 번호를 알려 드리겠습니다.

// this opens a connection, then sends GET & headers 
in = conn.getInputStream(); 

// can't get status before getInputStream. If you try, you'll 
// get a nasty exception. 
http_status = conn.getResponseCode(); 

// better check it first 
if (http_status/100 != 2) { 
    // redirects, server errors, lions and tigers and bears! Oh my! 
} 

첫 번째 및 두 번째 의견보기? 실제로는 실제 네트워크 연결이 HttpURLConnection.getInputStream() (서버에 콘텐츠를 전송하는 경우 HttpURLConnection.getOutputStream())으로 시작한다는 것을 알 때 많은 의미가 있습니다. 호출 getResponseCode()getInputStream() 후에 내 문제가 해결되었습니다.

관련 문제