2010-03-05 3 views
1

Я пытаюсь подключиться к веб-серверу, который у меня работает в моем приложении Android, но по какой-то причине он терпит неудачу.Использование HttpURLConnection на Android

Я могу подключиться к веб-странице в обычном режиме и с помощью браузера своего телефона, я также могу использовать приведенный ниже код для подключения к Google, но по какой-то причине мой код не будет подключаться к моему веб-серверу. Если я размещаю сервер на порту 80, я получаю код ошибки 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(); 
} 

Когда я пытаюсь код в ссылке, предложенной CommonsWare для порта 8080 я получаю ту же ошибку, как и раньше, за исключением тайм-аута. Для порта 80 я получаю следующее исключение: обе эти ошибки встречаются на url.openStream().

Порт 80 Исключение:

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 (ответ).

Для порта 80 я получаю веб-страницу, которая говорит, что она не может подключиться, который много редактирования HTML, однако главное, что написано на странице:

03-06 13:10: 23.576: ОШИБКА/ИМЯ (1267): веб-сервер может быть слишком занят или испытывать другие проблемы, не позволяя ему отвечать на запросы. Возможно, вы захотите повторить попытку позже.

+0

Я также могу предоставить код веб-сервера, если это необходимо. Я также добавил интернет в манифест, так что это не проблема –

+0

Вы используете эмулятор? – Rintoul

+0

Нет Я использую HTC Hero –

ответ

0

Что произойдет, если вы попробуете позвонить httpURLConnection.connect() после звонка url.openConnection()?

+0

Я пробовал это и вот результаты. Когда я пытаюсь подключиться к порту 80 на сервере, я получаю вызов функции getResponse90, а затем ошибку 503. Когда я пытаюсь с портом 8080, я получаю исключение тайм-аута при вызове функции connect() –

1

Различные ноты:

  • Вы не указывают, где произошел тайм-аут.
  • Вы можете попробовать this example, который использует URL-адрес иначе, чем вы.
  • Ваш код ошибки 503 на порту 80 должен содержать информацию о некорректной ошибке на вашем сервере, которая может быть полезна.
  • Есть ли прокси-серверы или другие вещи между вашим телефоном и веб-сервером?
  • Вы пробовали использовать как WiFi, так и 3G?
  • Вы можете попробовать переключиться на HttpClient и посмотреть, есть ли у вас лучшие результаты или, возможно, лучшее сообщение об ошибке.
+0

Добавил вышеприведенный код с моим ответом для проверки нового кода. На веб-сервере он предназначен для печати ответа при подключении, однако он не говорит, что кто-либо подключается к любой из вышеперечисленных попыток. Я проведу HttpClient немного и вернусь к результатам. Также у меня есть доступ к 3G-атакам, и тестирование на Wi-Fi окажется сложным. Насколько я знаю, между моим телефоном и веб-сервером нет прокси-серверов. –

+0

У вашего оператора связи могут быть прокси-серверы между вашим телефоном и вашим сервером. По-видимому, они могут не поддерживать порт 8080, хотя я бы нашел это несколько необычным. В частности, для теста на порт 80, проверьте, действительно ли ваш сервер регистрирует хит. FWIW, я бы рекомендовал шаблон ResponseHandler для текстовых ответов с помощью HttpClient. – CommonsWare

+0

Я не думаю, что есть прокси-сервер, так как, когда я использую обычный браузер телефона, я могу получить доступ к веб-странице независимо от порта. Поэтому в моем коде должно быть что-то не так. –

-2

Только приложение с правами доступа root может открывать порты ниже 1024 - это проблема с портом 80.

+1

Это для серверов. Он не пишет сервер. Else, что означало бы, что каждое приложение имеет права root, что, конечно же, не так. – bos

1

Ваша проблема слишком сложна (по моему мнению), чтобы полностью ее решить, поэтому я хотел бы поделиться своими выводами о проблеме, которую я недавно имел, что вызвало именно то, что вы описали в своем комментарии:

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

тот же кусок кода вызвало IOException в одном из моих классов - каждый раз, когда на каждый действительный URL, так что было ясно, что проблема была в коде - который выглядел так же, как ваш - не набор простых, без заголовков, ничего выше примеров, похожих на учебник. Затем я заметил, что каждый пример, который я видел, даже не вызывал метод URLConnection.connect() - поэтому я подумал: когда происходит фактическое соединение? Как выглядит стандартный шаблон использования HttpURLConnection?

К сожалению, документации по этой теме недостаточно. Итак, я сделал несколько поисковых запросов и нашел этот пост в блоге: HttpURLConnection's Dark Secrets - by Tim Bray, который был неоценим в письменной форме более сложным HttpURLConnection use-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! 
} 

См. 1-й и 2-й комментарий? Ну, это имеет большой смысл, когда вы знаете, что фактическое сетевое подключение инициируется HttpURLConnection.getInputStream() (HttpURLConnection.getOutputStream(), если вы отправляете на сервер какой-либо контент). Размещение вызова getResponseCode()послеgetInputStream() исправил мою проблему.