Android-приложению не удалось получить контент через 80 портов с помощью HttpClient - PullRequest
0 голосов
/ 13 августа 2011

Я хочу разработать приложение для Android, чтобы получить post.xml с HttpClient. Но он не смог получить контент с 80 портом.

Если я запускаю веб-сервер (здесь WEBrick) с портом 3000, URI будет http://192.168.1.103:3000/posts.xml; Android-приложение может получить ответ правильной длины, например 568;

Те же веб-файлы, я запустил их с другого сервера (Nignx здесь) с портом 80, URI "http://192.168.1.103/posts.xml; Android-приложение НЕ может получить контент с длиной, здесь -1.
Этот URI можно правильно открыть в браузере (как на компьютере, так и на эмуляторе Android). Кроме того, ответом является «HTTP / 1.1 200 OK» с responsep.getStatusLine ().

это связано с тем, что «порты сокета ниже 1024 НЕ могут получить доступ в системе, подобной Linux», которая включена http://groups.google.com/group/android-developers/browse_thread/thread/660123ca64ba1229#

Любой ниндзя может сказать мне, что мне делать, если я могу получить контент с 80 портом?

Ниже приведен мой код.

открытый класс AndroidWorldActivity расширяет Activity { / ** Вызывается при первом создании действия. * /

TextView tv; 

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    retreiveProjects();
}


private void retreiveProjects()
{
  HttpClient httpClient = new DefaultHttpClient();
  try
  {
    String url3000 = "http://192.168.1.103:3000/posts.xml";
    String url = "http://192.168.1.103/posts.xml";

    Log.d( "posts", "performing get " + url3000);
    HttpGet httpGet=new HttpGet(url3000);

    HttpResponse responsep=httpClient.execute(httpGet);        
    System.out.println(responsep.getStatusLine());

    HttpEntity httpEntity = responsep.getEntity();
    int length = ( int ) httpEntity.getContentLength();

// печать длины содержимого

    System.out.println("The content length is: "+length);
    Log.d( "posts", "The content length is: " + length );

Ответы [ 2 ]

1 голос
/ 13 августа 2011

Из вашего описания я понимаю, что вы пытаетесь подключить с adroid к к внешнему HTTP-серверу, подключенному к порту 80? Если это так, то ограничение на порт ниже 1024 на Android не имеет никакого отношения (вы не пытаетесь прослушивать порт 80 на устройстве Android). Я думаю, что у вас проблемы с Nginx.

Попробуйте выполнить запрос GET с внешнего компьютера к Nginx и исследовать содержимое ответа (заголовки, полезная нагрузка). Я бы порекомендовал сделать это с помощью более низкоуровневого инструмента вместо веб-браузера (в настоящее время почти все веб-браузеры способны «восстанавливать» неправильные ответы сервера), например, curl:

curl -D - http://192.168.1.103/posts.xml

0 голосов
/ 13 августа 2011

Похоже, у вас есть две отдельные проблемы.

Проблема на WeBrick заключается в том, что UNIX / Linux не позволяет вашему веб-серверу подключаться к порту 80. Есть две очевидные вещи, которые нужно проверить:


Проблема с Nignx другая.Здесь сервер запущен и работает и выдает клиенту ответы, но клиент видит -1 в качестве длины контента.

Это нормальное поведение.Метод getContentLength() возвращает -1, если ответ не имеет заголовка «Content-length», и он вполне допустим (в соответствии со спецификацией HTTP) для ответа, который не имеет этого заголовка.У вас есть два варианта:

  • Измените ваше клиентское приложение, чтобы иметь дело со случаем, когда длина контента не указана;Например, просто прочитайте тело в буфер и посчитайте, сколько байтов вы получили.

  • Измените сервер, чтобы установить соответствующий заголовок.


FOLLOWUP

Понятно.Ваш первоначальный вопрос было трудно понять, и я неверно истолковал.Вы, казалось, говорили, что WEBrick вообще не работал.

Разница между WEBrick и Nginx заключается в том, что они просто реализуют ответ по-разному.Оба являются законной (действительной) реализацией.Реальная проблема заключается в том, что ваше приложение предполагает, что веб-сервер всегда будет устанавливать заголовок «Content-length».Это неверное предположение .

Повторим, проблема / ошибка в коде вашего клиента, а не в Nginx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...