опрос HTTP-сервера из клиента J2ME - PullRequest
4 голосов
/ 08 августа 2009

У меня на мобильном телефоне (клиент) работает приложение J2ME,

Я хотел бы открыть HTTP-соединение с сервером и продолжать запрашивать обновленную информацию на сервере.

Каждый проведенный опрос будет использовать байты GPRS и в долгосрочной перспективе окажется дорогостоящим, поскольку биллинг GPRS основан на отправленных и полученных пакетах. Есть ли эффективный байтовый способ опроса с использованием протокола HTTP?

Я также слышал о длительных опросах, но я не уверен, как это работает и насколько эффективно это будет.

На самом деле предпочтительным способом для Сервера было бы сообщить телефонному приложению, что новые данные готовы к использованию, поэтому опрос не требуется, однако я не знаю этих методов, особенно в J2ME.

Ответы [ 4 ]

6 голосов
/ 09 августа 2009

Если вы хотите решить эту проблему, используя только HTTP, длинный опрос будет лучшим способом. Это довольно просто. Сначала необходимо настроить URL-адрес на стороне сервера для уведомления (например, http://example.com/notify) и определить протокол уведомления. Протокол может быть таким же простым, как несколько текстовых строк, и каждая строка является событием. Например,

  MSG user1
  PHOTO user2 album1
  EMAIL user1
  HEARTBEAT 300

Тема опроса на телефоне работает следующим образом,

  1. Установите HTTP-соединение с URL-адресом уведомления. В J2ME вы можете использовать GCF HttpConnection.
  2. Сервер будет блокироваться, если нет событий для отправки.
  3. Если сервер отвечает, получите каждую строку и создайте новый поток, чтобы уведомить приложение и вернуться к # 1.
  4. Если соединение по какой-либо причине закрывается, поспите некоторое время и вернитесь к шагу 1.

Вы должны обратить внимание на следующие детали реализации,

  1. Настройка таймаутов HTTP на клиенте и сервере. Чем дольше время ожидания, тем эффективнее. Тайм-аут соединения приведет к переподключению.
  2. Включить поддержку активности HTTP на телефоне и на сервере. Трехстороннее рукопожатие TCP дорого обходится в GPRS, поэтому старайтесь избегать его.
  3. Обнаружение устаревших соединений. В мобильных средах очень просто получить устаревшие HTTP-соединения (соединение разорвано, но поток опроса все еще ждет). Вы можете использовать сердцебиение для восстановления. Скажите, что сердцебиение составляет 5 минут. Сервер должен отправлять уведомления каждые 5 минут. Если нет данных, чтобы нажать, просто отправьте СЕРДЦЕ. На телефоне поток опроса должен попытаться закрыть и снова открыть соединение для опроса, если ничего не получено в течение 5 минут.
  4. Тщательная обработка ошибок подключения. Длинный опрос не работает хорошо, когда есть проблемы с подключением. Если не обработано должным образом, это может быть нарушителем соглашения. Например, вы можете тратить много пакетов на шаге 4, если сон не достаточно длинный. Если возможно, проверьте доступность GPRS на телефоне и переведите поток опроса в режим ожидания, когда GPRS недоступен для экономии заряда батареи.
  5. Стоимость сервера может быть очень высокой, если она не реализована должным образом. Например, если вы используете сервлет Java, каждое работающее приложение будет иметь как минимум одно соответствующее соединение для опроса и его поток. В зависимости от количества пользователей, это может быстро убить Tomcat :) Вам необходимо использовать ресурсоэффективные технологии, такие как Apache Mina.

Мне сказали, что есть другие, более эффективные способы отправки уведомлений на телефон, такие как использование SMS и некоторые хитрости на уровне IP. Но вы либо должны сделать какое-то непереносимое программирование низкого уровня, либо столкнуться с риском нарушения патента. Длинные опросы - это, вероятно, лучшее, что вы можете получить, используя только HTTP-решение.

2 голосов
/ 08 августа 2009

Я не знаю точно, что вы подразумеваете под "опросом", вы имеете в виду что-то вроде IMAP IDLE ? Соединение остается открытым, и нет никаких накладных расходов для создания самого соединения снова и снова. Как уже говорилось, еще одно возможное решение - заголовок заголовка HTTP-запроса (забыл, спасибо!).

В этом руководстве приведены основные сведения о HTTP-соединениях в J2ME.

Выгрузка данных в приложение / устройство без поддержки Push (например, Blackberry) невозможна.

1 голос
/ 09 августа 2009

Лучший способ сделать это - использовать сокетное соединение. Многие приложения, такие как GMail, используют их.

1 голос
/ 08 августа 2009

HTTP-запрос HEAD - это метод, который HTTP предоставляет, если вы хотите проверить, изменилась страница или нет, он используется браузерами и прокси-серверами, чтобы проверить, была ли страница обновлена ​​или нет без большой пропускной способности.

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

...