Помогите потоковой передачи по http в C ++ - PullRequest
3 голосов
/ 11 февраля 2010

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

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

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

Любая помощь будет высоко ценится.

Ответы [ 2 ]

6 голосов
/ 11 февраля 2010

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, чтобы увидеть, какие операции будет поддерживать ваш поток Boost.ASIO. Вы обнаружите, что они не так уж отличаются от тех, что в API Java IO. РЕДАКТИРОВАТЬ: Эрик прав, вам придется отправлять некоторые запросы на сервер (используя тот же поток), поэтому он, вероятно, менее похож на openStream Java, чем я думал. В следующем примере показано, как сделать эти запросы:

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

3 голосов
/ 11 февраля 2010

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

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

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