Вопрос

Я хочу использовать веб-сервис, предлагающий потоковый API.Этот API обычно может использоваться Java-методом java.net.URL.openStream();

Проблема в том, что я пытаюсь разработать свою программу на C++ и понятия не имею, какие библиотеки (я слышал, что библиотека cUrl очень хороша в подобных вещах) использовать или как их использовать, чтобы делать то, что я хочу.

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

Любая помощь приветствуется.

Это было полезно?

Решение

Boost.Asio Кажется, что сокеты iostreams — это то, что вам нужно.Ваш код будет выглядеть так:

ip::tcp::iostream stream("www.someserver.com", "http");
if (!stream)
{
  // Can't connect.
}

// Use stream as a regular C++ input stream:
std::string text;
std::getline(stream, text);

Если вы новичок в C++ и не имеете опыта работы с iostreams, тогда эта страница является отличным источником информации.В частности, проверьте документы istream class, чтобы узнать, какие операции будет поддерживать ваш поток Boost.ASIO. Вы обнаружите, что они не так уж отличаются от API Java IO.

РЕДАКТИРОВАТЬ:

Эрик прав, вам придется отправить несколько запросов на сервер (используя тот же поток), поэтому он, вероятно, менее похож на Java. openStream чем я думал.В следующем примере показано, как выполнять эти запросы:

http://blog.think-async.com/2007_01_01_archive.html

Другие советы

Это зависит от того, что вам нужно. Предложение Мануэля boost::asio::ip::tcp::iostream хорош, если вы хотите что-то на более низком уровне, напрямую возвращая «необработанный» ответ сервера (однако я подозреваю, что чего-то не хватает в примере, приведенном в его ответе:Я думаю, что запрос «GET» должен быть записан в поток перед чтением из него.Видеть этот пример из документации Asio).

У меня нет опыта работы с java.net.URL.openStream(), но кажется, что он находится на немного более высоком уровне, поскольку возвращает только тело (а не заголовки) ответа, заботится о перенаправлениях HTTP и т. д.В этом случае да, libcurl может быть тем, что вам нужно.Вы также можете взглянуть на cpp-netlib библиотека, построенная на основе Boost.Asio.Оно все еще находится в зачаточном состоянии, но уже http::клиент кажется, уже предоставляет что-то очень похожее на то, что предоставляет Java URL.openStream()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top