опрос HTTP-сервера с помощью клиента J2ME
Вопрос
У меня есть приложение J2ME, запущенное на моем мобильном телефоне (клиент).,
Я хотел бы открыть HTTP-соединение с сервером и продолжить опрос для получения обновленной информации на сервере.
Каждый выполняемый опрос израсходует байты GPRS и в долгосрочной перспективе обойдется дорого, поскольку выставление счетов GPRS основано на отправленных и полученных пакетах.Существует ли эффективный в байтах способ опроса с использованием протокола HTTP?.
Я также слышал о длительном опросе, но я не уверен, как это работает и насколько эффективно это было бы.
На самом деле предпочтительным способом для Сервера было бы сообщить приложению phone, что новые данные готовы к использованию, таким образом, опрос не потребуется, однако я не знаю об этих методах, особенно в J2ME.
Решение
Если вы хотите решить эту проблему, используя только HTTP, длинный опрос был бы лучший способ.Это довольно легко.Сначала вам необходимо настроить URL-адрес на стороне сервера для уведомлений (например, http://example.com/notify
) и определить протокол уведомления.Протокол может состоять из нескольких текстовых строк, и каждая строка является событием.Например,
MSG user1
PHOTO user2 album1
EMAIL user1
HEARTBEAT 300
Ветка опроса на телефоне работает следующим образом:
- Установите HTTP-соединение с URL-адресом уведомления.В J2ME вы можете использовать GCF HttpConnection.
- Сервер заблокируется, если нет событий для отправки.
- Если сервер отвечает, получите каждую строку и создайте новый поток для уведомления приложения и возврата к #1.
- Если соединение по какой-либо причине закрывается, подождите немного и вернитесь к шагу 1.
Вы должны обратить внимание на следующие детали реализации:
- Настройте тайм-ауты HTTP как на клиенте, так и на сервере.Чем дольше тайм-аут, тем эффективнее.Время ожидания соединения приведет к повторному подключению.
- Включите поддержку активности HTTP как на телефоне, так и на сервере.Трехстороннее рукопожатие TCP является дорогостоящим с точки зрения GPRS, поэтому старайтесь избегать его.
- Обнаружение устаревших соединений.В мобильных средах очень легко получить устаревшие HTTP-соединения (соединение пропало, но поток опроса все еще ожидает).Вы можете использовать сердцебиение для восстановления.Скажем, частота пульса составляет 5 минут.Сервер должен отправлять уведомление каждые 5 минут.Если нет данных для отправки, просто отправьте HEARTBEAT.На телефоне поток опроса должен попытаться закрыть и снова открыть соединение для опроса, если в течение 5 минут ничего не получено.
- Тщательная обработка ошибок подключения.Длинный опрос не работает, если есть проблемы с подключением.Если с этим не обращаться должным образом, это может стать решающим фактором.Например, вы можете потерять много пакетов на шаге 4, если сон будет недостаточно продолжительным.Если возможно, проверьте доступность GPRS на телефоне и приостановите опрос, когда GPRS недоступен, чтобы сэкономить заряд батареи.
- Стоимость сервера может быть очень высокой, если он не реализован должным образом.Например, если вы используете сервлет Java, каждое работающее приложение будет иметь по крайней мере одно соответствующее соединение опроса и его поток.В зависимости от количества пользователей это может быстро убить Tomcat :) Вам необходимо использовать ресурсосберегающие технологии, такие как Apache Mina.
Мне сказали, что есть другие, более эффективные способы отправки уведомлений на телефон, например, с помощью SMS и некоторых приемов на уровне IP.Но вам либо придется заняться непереносимым программированием низкого уровня, либо столкнуться с риском нарушения патентов.Длинный опрос, вероятно, лучшее, что вы можете получить с помощью только HTTP-решения.
Другие советы
Я не знаю точно, что вы подразумеваете под «опросом», вы имеете в виду что-то вроде IMAP в режиме ожидания?Соединение остается открытым, и не требуется дополнительных затрат на повторное создание самого соединения.Как уже говорилось, другим возможным решением является заголовок HEAD HTTP-запроса (забыл, спасибо!).
Посмотрите на это руководство основы HTTP-соединений в J2ME.
Передача данных в приложение/устройство без поддержки Push (например, Blackberry) невозможна.
Тот Самый ГОЛОВНОЙ HTTP-запрос это метод, который HTTP предоставляет, если вы хотите проверить, изменилась страница или нет, он используется браузерами и прокси-серверами для проверки того, была ли страница обновлена или нет, без использования большой пропускной способности.
В терминах HTTP, запрос HEAD такой же, как GET без тела, я предполагаю, что это будет максимум пара сотен байт, что выглядит приемлемо, если ваши опросы проводятся не очень часто.
Лучший способ сделать это — использовать сокетное соединение.Их используют многие приложения, такие как GMail.