websocketpp官方非官方翻译指南(上

websocket和http协议是同一个层面的协议。为什么需要websocket协议,自然是因为http的缺点:永远是客户端发起请求,这个也就注定了我们要用轮询的方法去访问服务器。针对轮询超低的效率,工程师开发了websocket协议。在这里不对该协议做过多的解释。主要是来写一下websocketpp的指南,websocketpp的作用是将websocket服务嵌入c/c++语言程序中,并且该库只有头文件。根多的相关信息可以上github看。 下面是多功能客户端模板的指南翻译,特别鸣谢 https://translate.google.cn/

Utility Client Example Application Tutorial

第1章:初始设置和基础知识

设置基本类型,打开和关闭连接,发送和接收消息。

步骤1

下面我们先给出一个循环程序,这个程序会提示用户输入命令,并且进行处理。本教程中,我们将会修改这个程序来执行一些任务,还有通过一个websocket连接从远程服务器中检索数据。

编译

clang++ step1.cppg++ step1.cpp

Code so far

#include <iostream>
#include <string>

int main() {
    bool done = false;
    std::string input;

    while (!done) {
        std::cout << "Enter Command: ";
        std::getline(std::cin, input);

        if (input == "quit") {
            done = true;
        } else if (input == "help") {
            std::cout
                << "\nCommand List:\n"
                << "help: Display this help text\n"
                << "quit: Exit the program\n"
                << std::endl;
        } else {
            std::cout << "Unrecognized Command" << std::endl;
        }
    }

    return 0;
}

步骤2

添加WebSocket++ includes文件并且设置端点类型

WebSocket++ 包括两个主要的对象类型:端点和连接。
端点创建并启动新连接,同时维护这些连接的默认设置。端点还管理所有的共享网络资源。
连接储存每一个特定的WebSocket的会话信息。

Note: 一旦连接启动了,端点和连接之间就没联系了。 所有的默认设置都会被端点复制到连接中。之后再修改端点上的默认设置也只能影响未来建立的新连接。连接不维护寻找他相关端点的链接。 端点也不维护未完成连接的列表. 如果您的应用程序需要遍历所有连接,则需要自己维护它们的列表。

WebSocket++ 端点由端点角色和端点配置结合而成。 在websocket会话中端点有客户端和服务器两个角色。 本教材是客户端教程,websocketpp::client<websocketpp/client.hpp>头文件提供。

术语:端点配置

WebSocket++ 端点具有一组可以在编译时通过config模板参数配置的设置。config是一个结构,并且它包含用于生成具有特定属性的端点的类型和静态常量。根据正在使用的配置,端点有不同的使用方法,并且还可能依赖于第三方。

端点角色采用名为的模板参数config,该参数用于在编译时配置端点的行为。 在这个例子中,我们将使用asio_client库提供的默认配置,包含在 <websocketpp/config/asio_no_tls_client.hpp>中。 这是一个客户端配置,它使用boost :: asio来提供网络传输,并且不支持基于TLS的安全性。稍后我们将讨论如何将基于TLS的安全性引入WebSocket ++应用程序,和更多关于其他库的配置,和如何构造自定义配置。

通过config和端点角色组合以生成的一个完全配置的端点,这种类型会经常使用,所以在这里推荐一个typedef。

typedef websocketpp::client<websocketpp::config::asio_client> client

编译

WebSocket++的加入给我们带来了一些必须要解决的依赖问题。首先,你的build系统中必须能找到websocket++与boost的头文件。如何解决这些问题取决于你的websocket++的路径和你正在使用的build系统。

除了新的头文件以外,boost :: asio还依赖于boost_system共享库。这将需要添加(作为静态或动态)链接器。有关链接到共享库的说明,请参阅构建环境文档。(或者自行学习boost的使用)

clang++ step2.cpp -lboost_system

Code so far

#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/client.hpp>

#include <iostream>
#include <string>

typedef websocketpp::client<websocketpp::config::asio_client> client;

int main() {
    bool done = false;
    std::string input;

    while (!done) {
        std::cout << "Enter Command: ";
        std::getline(std::cin, input);

        if (input == "quit") {
            done = true;
        } else if (input == "help") {
            std::cout
                << "\nCommand List:\n"
                << "help: Display this help text\n"
                << "quit: Exit the program\n"
                << std::endl;
        } else {
            std::cout << "Unrecognized Command" << std::endl;
        }
    }

    return 0;
}

Step 3

创建处理初始化和设置后台线程的端点包装器对象

为了在后台进行网络处理时处理用户输入,我们将为WebSocket ++处理循环使用单独的线程。 这使主线程可以自由处理前台用户输入。 为了使我们的线程和端点启用简单的RAII样式资源管理,我们将使用一个包装器对象,在它的构造函数中配置它们。

术语: websocketpp::lib namespace

WebSocket++ 被设计与 C++11 标准库一同使用。 由于这在流行的构建系统中并非普遍可用,因此使用Boost库作为C ++ 98构建环境中C ++ 11标准库的polyfill。websocketpp::lib namespace被用作抽象出两者的区别,websocketpp::lib::shared_ptr在C++11环境中等价于std::shared_ptr,否则就作为boost::shared_ptr`。

本教程直接使用websocketpp::lib 包装器版本。因为它不知道读者的环境是什么。对于您的引用程序,如果您对可移植性感兴趣,可以试试boost或std的版本。

在websocket_endpoint构造函数中,发生了几件事:

首先,我们通过清除所有访问和错误记录通道将端点日志记录行为设置为静默。(用set_access_channels(websocketpp::log::alevel::all);方法打开所有的log

m_endpoint.clear_access_channels(websocketpp::log::alevel::all);
m_endpoint.clear_error_channels(websocketpp::log::elevel::all);

接下来,我们初始化端点下面的传输系统并将其设置为永久模式。 在永久模式下,端点的处理循环在没有连接时不会自动退出。 这很重要,因为我们希望此端点在我们的应用程序运行时保持活动状态,并根据需求处理新WebSocket连接的请求。 这两种方法都特定于asio传输。 在使用非asio配置的端点中,它们不是必需的。

m_endpoint.init_asio();
m_endpoint.start_perpetual();

最后,我们启动一个线程来运行客户端端点的run方法。 在端点运行时,它将处理连接任务(读取和传递传入消息,帧和发送传出消息等)。 因为它以永久模式运行,所以当没有连接处于活动状态时,它将等待新连接。

m_thread.reset(new websocketpp::lib::thread(&client::run, &m_endpoint));

Build

现在我们的客户端端点模板已经逐渐成型,所以回需要更多的连接库。 特别是,WebSocket客户端需要加密安全的随机数生成器,所以WebSocket++ 需要boost_random 或 C++11 标准库 。 这个例子使用了线程,所以我们也需要 C++11 std::thread 或者 boost_thread

Clang (C++98 & boost)

clang++ step3.cpp -lboost_system -lboost_random -lboost_thread

Clang (C++11)

clang++ -std=c++0x -stdlib=libc++ step3.cpp -lboost_system -D_WEBSOCKETPP_CPP11_STL_

G++ (C++98 & Boost)

g++ step3.cpp -lboost_system -lboost_random -lboost_thread

G++ v4.6+ (C++11)

g++ -std=c++0x step3.cpp -lboost_system -D_WEBSOCKETPP_CPP11_STL_

Code so far

#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/client.hpp>

#include <websocketpp/common/thread.hpp>
#include <websocketpp/common/memory.hpp>

#include <iostream>
#include <string>

typedef websocketpp::client<websocketpp::config::asio_client> client;

class websocket_endpoint {
public:
    websocket_endpoint () {
        m_endpoint.clear_access_channels(websocketpp::log::alevel::all);
        m_endpoint.clear_error_channels(websocketpp::log::elevel::all);

        m_endpoint.init_asio();
        m_endpoint.start_perpetual();

        m_thread.reset(new websocketpp::lib::thread(&client::run, &m_endpoint));
    }
private:
    client m_endpoint;
    websocketpp::lib::shared_ptr<websocketpp::lib::thread> m_thread;
};

int main() {
    bool done = false;
    std::string input;
    websocket_endpoint endpoint;

    while (!done) {
        std::cout << "Enter Command: ";
        std::getline(std::cin, input);

        if (input == "quit") {
            done = true;
        } else if (input == "help") {
            std::cout
                << "\nCommand List:\n"
                << "help: Display this help text\n"
                << "quit: Exit the program\n"
                << std::endl;
        } else {
            std::cout << "Unrecognized Command" << std::endl;
        }
    }

    return 0;
}

原文链接: https://www.cnblogs.com/RXCPAlice/p/10497270.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    websocketpp官方非官方翻译指南(上

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/291135

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 下午1:26
下一篇 2023年2月15日 下午1:26

相关推荐