WEBSOCKETPP使用简介+demo

标题一、C++跨平台集成WEBSOCKETPP

1. WEBSOCKETPP使用

1.1 整体使用流程

从Websocketpp的例子中,拷贝需要用到的头文件包含和一些类型重定义

#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>

using websocketpp::connection_hdl;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
typedef websocketpp::server<websocketpp::config::asio> server;
typedef server::message_ptr message_ptr;
// 生成server对象
server m_server; 

// 初始化m_server
m_server.set_access_channels(websocketpp::log::alevel::none); // 设置打印的日志等级

m_server.init_asio(); // 初始化asio

m_server.set_open_handler(bind(&XXXClass::on_open_func_ptr, this, ::_1)); // 绑定websocket连接到来时的回调函数
m_server.set_close_handler(bind(&XXXClass::on_close_func_ptr, this, ::_1)); // 绑定websocket连接断开时的回调函数
m_server.set_message_handler(bind(&XXXClass::on_message_func_ptr, this, ::_1, ::_2)); // 绑定websocket连接有消息到来时的回调函数

上面三个回调函数的原型如下,我是将server对象直接封装到一个类里面使用的,因此这里绑定的回调函数可以直接使用类的方法。Websocketpp也提供了其他很多环节上的回调函数设定,可自行查看其源代码进行了解。

class XXXClass
{
   
public :
    void on_open_func_ptr(connection_hdl hdl);
    void on_close_func_ptr(connection_hdl hdl);
    void on_message_func_ptr(connection_hdl hdl, message_ptr msg);
}

回调参数中的connection_hdl是一个weak_ptr,如果需要将连接存到容器中以便管理,则不能使用传入的hdl,需要使用

server::connection_ptr con = m_server.get_con_from_hdl(hdl);

获得的con是个shared_ptr,再调用

void *con_ptr = con->get();

可以得到这个连接的实际对象的地址,但websocketpp对我们隐藏了其对象的结构,只给了我们一个void*,不过用于在每次回调时区分不同的客户端足够了。
当websocket有新消息到来时,我们可以通过

std::string msg_str = msg->get_payload();

直接获取到传输的内容。

以上,就是websocketpp集成后的简单使用流程,server对象其实还提供了很多的使用方法以及回调绑定功能,等有时间我再详细研究,现在这几个已经能满足我的需求了。

#include <websocketpp/config/asio_no_tls.hpp>

#include <websocketpp/server.hpp>

#include <iostream>

#include "HG.h"


typedef websocketpp::server<websocketpp::config::asio> server;

using websocketpp::lib::bind;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;

// pull out the type of messages sent by our config
typedef server::message_ptr message_ptr;


// Define a callback to handle incoming messages
void on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg)
{
   
    HG hg;
    std::string res = "指令失效";

    std::cout << "on_message called with hdl: " << hdl.lock().get()
        << " and message: " << msg->get_payload()
        << std::endl;

    // check for a special command to instruct the server to stop listening so
    // it can be cleanly exited.
    if (msg->get_payload() == "stop-listening")
    {
   
        s->stop_listening();
        return;
    }

    if (msg->get_payload() == "v")
    {
   
        try
        {
   
            hg.Version();
            s->send(hdl, hg.m_strQR, msg->get_opcode());
        }
        catch (websocketpp::exception const& e)
        {
   
            std::cout << "Echo failed because: "
                << "(" << e.what() << ")" << std::endl;
        }
        return;
    }

    if (msg->get_payload() == "x")
    {
   
        try
        {
   
            hg.Scan();
            res = hg.m_strQR;
            s->send(hdl, res, msg->get_opcode());
        }
        catch (websocketpp::exception const& e)
        {
   
            std::cout << "Echo failed because: "
                << "(" << e.what() << ")" << std::endl;
        }
        return;
    }

    try
    {
   
        s->send(hdl, res, msg->get_opcode());
    }
    catch (websocketpp::exception const& e)
    {
   
        std::cout << "Echo failed because: "
            << "(" << e.what() << ")" 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值