【问题标题】:Help streaming over http in C++帮助在 C++ 中通过 http 进行流式传输
【发布时间】:2011-01-15 14:35:12
【问题描述】:

我希望使用提供流式 API 的网络服务。这个api一般可以被java方法java.net.URL.openStream()使用;

问题是我正在尝试用 C++ 设计我的程序,但不知道要使用哪些库(我听说 cUrl 库非常擅长这类事情),或者如何使用它们来做我想做的事.

这个想法是,在将文件作为流打开后,我可以实时访问不断更新的数据。

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ curl streaming boost-asio


    【解决方案1】:

    Boost.Asio socket 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 的经验,那么this page 是一个很好的信息来源。特别是,检查istream 类的文档以查看您的 Boost.ASIO 流将支持哪些类型的操作。 您会发现它们与 Java IO API 中的没有太大区别。

    编辑:

    Eric 是对的,您必须向服务器发送一些请求(使用相同的流),因此它可能不像我想象的那样与 Java 的 openStream 相似。以下示例显示了如何发出这些请求:

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

    【讨论】:

    • 为了使您的示例正常工作,我认为您必须先在流上编写一个“GET”请求,然后再从流中读取。比如:stream << "GET /index.html HTTP/1.0\r\n\r\n";
    • 谢谢 Éric,我错过了。
    【解决方案2】:

    这取决于你追求什么。 Manuel's suggestion of boost::asio::ip::tcp::iostream 如果您想要较低级别的内容,直接返回“原始”服务器响应,则很好(但是,我怀疑在提供的示例中缺少某些内容他的回答:我认为应该在读取流之前将“GET”请求写入流。请参阅 Asio 文档中的this example)。

    我没有使用 java.net.URL.openStream() 的经验,但它似乎处于更高的级别,因为它只返回回复的正文(而不是标题),负责 HTTP 重定向等。在这种情况下,是的,libcurl 可能更符合您的要求。您还可以查看构建在 Boost.Asio 之上的 cpp-netlib 库。它仍处于起步阶段,但它的 http::client 似乎已经提供了与 Java URL.openStream() 提供的非常相似的东西

    【讨论】:

      猜你喜欢
      • 2017-10-27
      • 2013-10-17
      • 1970-01-01
      • 2010-09-25
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      相关资源
      最近更新 更多