Использование HttpURLConnection на Android - PullRequest
1 голос
/ 05 марта 2010

Я пытаюсь подключиться к веб-серверу, запущенному в моем приложении для 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 (response).

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

03-06 13: 10: 23.576: ERROR / SAMES (1267): возможно, веб-сервер не работает, слишком занят или испытывает другие проблемы, не позволяющие ему отвечать на запросы. Вы можете попробовать еще раз позже.

Ответы [ 4 ]

1 голос
/ 04 декабря 2012

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

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

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

К сожалению, документации по этой теме недостаточно.Поэтому я немного погуглил и нашел этот пост в блоге: Темные секреты HttpURLConnection - от Тима Брея , который был неоценим при написании более сложных HttpURLConnection вариантов использования.Это также дало ответ на мою проблему - позвольте мне процитировать соответствующие строки:

// 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() решило мою проблему.

1 голос
/ 06 марта 2010

Различные заметки:

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

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

0 голосов
/ 06 марта 2010

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

...