2016-05-30 6 views
0

Можно ли отправить HTTP-запрос, не дожидаясь ответа?HTTP-запросы без ожидания ответа

Я работаю над проектом IoT, требующим регистрации данных с датчиков. В каждой установке есть много датчиков и один центральный координатор (в основном будет реализован с помощью малины Pi), который собирает данные с датчиков и отправляет данные на сервер через Интернет.

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

Все в порядке, если несколько пакетов отбрасываются время от времени.

Также, пожалуйста, скажите мне, как наилучшим образом реализовать это. Предпочтительно в Java.

Серверная сторона реализована с использованием PHP.

Заранее благодарен!

EDIT: Датчики беспроводные, но технология, которую они используют, очень мала (или нет) при отправке координатору. Этот координатор должен отправить данные через Интернет. Но просто предположим, что интернет-соединение плохое. Поскольку это будет реализовано в отдаленной части Индии.

+0

Всегда есть асинхронные запросы: https://hc.apache.org/httpcomponents-asyncclient-dev/quickstart.html. – Chill

+0

Да, но это может быть проблемой для меня. Потому что есть много датчиков. Каждая передача данных в секунду. Очередь будет нарастать и стать действительно большой, не так ли? –

+0

Вы хотите использовать UDP в режиме «огонь и забыть»? Как и в, вас вообще интересует ответ сервера? http://stackoverflow.com/questions/10556829/sending-and-receiving-udp-packets-using-java может быть полезно в этом случае. – Chill

ответ

1

Вы ищете асинхронную HTTP-библиотеку, такую ​​как OkHttp. Он позволяет указать обратный вызов, который выполняется асинхронно (по второму потоку). Поэтому ваш основной поток продолжает выполнение.

+0

Да, но это может быть проблемой для меня. Потому что есть много датчиков. Каждая передача данных в секунду. Очередь будет нарастать и стать действительно большой, не так ли? –

+0

Это может произойти, но если у вас есть требования в реальном времени, Java - это неправильный язык для вас и TCP, соответственно, HTTP - неправильный протокол для субсекундных транзакций через Интернет. – Robert

+0

Нет, первый поток может проходить через ваши запросы журнала, отправляя все довольно быстро. Каждый из них установит обратный вызов, который активируется, когда сервер отвечает., И в вашем случае звучит так, будто это будет пустой метод. Может случиться, что использование памяти будет немного, если сервер будет медленным из-за наращивания записей обратного вызова, но это будет незначительным. – Nerdfest

0

Вы можете установить тайм-аут TCP для запроса GET менее чем за секунду и сохранить перезапуск доступа в потоке. Используйте больше потоков для большего количества устройств.

Что-то вроде:

HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); 
con.setRequestMethod("GET"); 
con.setConnectTimeout(1000); //set timeout to 1 second 
if (con.getResponseCode() == HttpURLConnection.HTTP_OK) { 
    ... 
} 

Сна резьбы на оставшуюся часть 1 секунды, если доступ менее чем за секунду. Вы можете использовать результаты в другом потоке, если вы добавите результаты в потокобезопасные очереди. Обязательно обрабатывайте исключения.

Вы не можете использовать UDP с HTTP, HTTP - только TCP.

Смежные вопросы