【问题标题】:Does boost::asio support websockets?boost::asio 是否支持 websockets?
【发布时间】:2016-08-02 08:27:01
【问题描述】:

我早些时候发布了question,询问为什么我的服务器(用 C++ 和 boost::asio 编写)无法连接到客户端(用 Javascript 编写)。 Javascript Websockets 与boost::asio sockets 不同的问题是什么? boost::asio 不支持 websockets 吗?解决这个问题的最简单方法是什么?

【问题讨论】:

  • 您最好的选择可能是websocket++。它有一个boost::asio 传输。事实上,您需要在asio 之上编写自己的 websocket 协议代码,或者使用现有的库,如 websocket++。
  • @SeanCline 我不能让 javascript 与套接字一起工作吗?
  • @Shiro 请参阅this question
  • @DanMašek 是的,问题是我想同时支持安卓和浏览器。这就是为什么我在考虑如何完成这项工作。
  • @DanMašek 作为记录,Wesocketpp 工作得很好。谢谢你。这是迄今为止在 C++ 中使用 websocket 最简单的方法。首先安装boost,然后将Websocketpp作为仅标头库添加到项目中。

标签: javascript c++ sockets websocket boost-asio


【解决方案1】:

Boost.Asio 不直接支持 WebSocket,但是有一个很棒的开源库,它非常接近 Boost.Asio 的模型,并且可以按照您期望的方式工作。你可以试一试,它只有标题并且只使用 boost。它带有示例代码和文档: http://vinniefalco.github.io/

这是一个向回显服务器发送消息的完整程序:

#include <beast/websocket.hpp>
#include <beast/buffers_debug.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <string>

int main()
{
    // Normal boost::asio setup
    std::string const host = "echo.websocket.org";
    boost::asio::io_service ios;
    boost::asio::ip::tcp::resolver r(ios);
    boost::asio::ip::tcp::socket sock(ios);
    boost::asio::connect(sock,
        r.resolve(boost::asio::ip::tcp::resolver::query{host, "80"}));

    using namespace beast::websocket;

    // WebSocket connect and send message using beast
    stream<boost::asio::ip::tcp::socket&> ws(sock);
    ws.handshake(host, "/");
    ws.write(boost::asio::buffer("Hello, world!"));

    // Receive WebSocket message, print and close using beast
    beast::streambuf sb;
    opcode op;
    ws.read(op, sb);
    ws.close(close_code::normal);
    std::cout <<
        beast::debug::buffers_to_string(sb.data()) << "\n";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多