websocket++简单使用及实例分析

Websocket++简单使用及实例分析

Websocket++是一个C++的WebSocket库,用于实现基于WebSocket协议的网络应用程序。这个库提供了许多的接口和功能,使得程序开发更为简单和高效,同时也支持多种平台和操作系统。本文将详细讲解Websocket++的简单使用及实例分析,帮助读者更好的了解这个库的特点和优势。

Websocket++的简单使用

下面将介绍Websocket++的简单使用步骤和方法:

步骤一:安装Websocket++

在开始之前,你需要先安装Websocket++库。可以通过以下命令在Linux平台中进行安装。

sudo apt-get install libwebsocketpp-dev

步骤二:创建WebSocket服务器

使用Websocket++库创建WebSocket服务器非常简单,只需要按照以下代码编写即可:

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

using namespace std;

int main() {
    try {
        // 创建服务器
        websocketpp::server<websocketpp::config::asio> server;

        // 设置监听端口和协议
        server.listen(9002);

        // 开始监听请求
        server.start_accept();

        cout << "WebSocket Server started on port 9002" << endl;

        // 进入事件循环
        server.run();
    } catch (websocketpp::exception const & e) {
        cerr << e.what() << endl;
    }
    return 0;
}

上述代码所创建的WebSocket服务器会在本地的9002端口启动,并开始监听请求。执行该程序,可以看到控制台输出 "WebSocket Server started on port 9002",表示WebSocket服务器已经开启。

步骤三:创建WebSocket客户端

使用Websocket++库创建WebSocket客户端同样非常简单,只需要按照以下代码编写即可:

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

using namespace std;

int main() {
    try {
        // 创建客户端
        websocketpp::client<websocketpp::config::asio_client> client;

        // 设置连接地址
        string uri = "ws://localhost:9002";

        // 连接WebSocket服务器
        client.connect(uri);
        cout << "Connected to " << uri << endl;

        // 进入事件循环
        client.run();
    } catch (websocketpp::exception const & e) {
        cerr << e.what() << endl;
    }
    return 0;
}

上述代码所创建的WebSocket客户端会连接到本地的9002端口,并开始监听服务器发送的数据。执行该程序,可以看到控制台输出 "Connected to ws://localhost:9002",表示WebSocket客户端已经成功连接到服务器。

实例分析

接下来,我们将给出两个Websocket++库的示例,帮助读者更好的了解这个库的使用方法和效果。

示例一:实现在线聊天室

在线聊天室是一个典型的使用WebSocket协议的应用场景,下面我们将使用Websocket++库来实现一个简单的在线聊天室,实现用户之间的实时聊天。

该在线聊天室的具体实现逻辑如下:

  • 用户进入聊天室后,后端记录下该用户的WebSocket连接,同时向所有在线的用户发送该用户进入的提示信息;
  • 用户发送聊天内容后,后端再将该内容发送给所有在线的用户。

下面是详细的实现代码:

服务端实现:

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

using namespace std;

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

vector<websocketpp::connection_hdl> users;

void on_message(server *sm, websocketpp::connection_hdl hdl, server::message_ptr msg) {
    // 向其他用户广播消息
    for(auto it=users.begin(); it!=users.end(); it++) {
        if (it->lock().get() != hdl.lock().get()) {
            sm->send(*it, msg->get_payload(), msg->get_opcode());
        }
    }
}

void on_open(server *sm, websocketpp::connection_hdl hdl) {
    // 记录新用户,并给其他用户发送进入提示
    users.push_back(hdl);
    for(auto it=users.begin(); it!=users.end(); it++) {
        if (it->lock().get() != hdl.lock().get()) {
            sm->send(*it, "A new user has joined the chat.");
        }
    }
}

void on_close(server *sm, websocketpp::connection_hdl hdl) {
    // 删除离线用户,并通知其他用户
    auto it = find(users.begin(), users.end(), hdl);
    if (it != users.end()) {
        users.erase(it);
    }
    for(auto it=users.begin(); it!=users.end(); it++) {
        sm->send(*it, "A user has left the chat.");
    }
}

int main() {
    try {
        // 创建服务器
        server ws_server;

        // 设置事件处理函数
        ws_server.set_message_handler(bind(&on_message, &ws_server, ::_1, ::_2));
        ws_server.set_open_handler(bind(&on_open, &ws_server, ::_1));
        ws_server.set_close_handler(bind(&on_close, &ws_server, ::_1));

        // 设置监听端口
        ws_server.listen(9002);

        cout << "WebSocket Server started on port 9002" << endl;

        // 进入事件循环
        ws_server.run();
    } catch (const websocketpp::exception& e) {
        cerr << "Error: " << e.what() << endl;
    } catch (...) {
        cerr << "Exception caught" << endl;
    }
    return 0;
}

客户端实现:

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

using namespace std;

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

void on_message(client *c, websocketpp::connection_hdl hdl, client::message_ptr msg) {
    cout << msg->get_payload() << endl;
}

int main() {
    try {
        // 创建客户端
        client ws_client;

        // 设置事件处理函数
        ws_client.set_message_handler(bind(&on_message, &ws_client, ::_1, ::_2));

        // 设置连接地址
        string uri = "ws://localhost:9002";

        // 连接WebSocket服务器
        websocketpp::lib::error_code ec;
        client::connection_ptr conn = ws_client.get_connection(uri, ec);
        if (ec) {
            cerr << "Could not connect: " << ec.message() << endl;
            return 1;
        }
        ws_client.connect(conn);

        // 进入事件循环
        ws_client.run();
    } catch (const websocketpp::exception& e) {
        cerr << "Error: " << e.what() << endl;
    } catch (...) {
        cerr << "Exception caught" << endl;
    }
    return 0;
}

启动服务端程序后,运行多个客户端,即可实现在线聊天室的功能。用户在输入聊天内容后,后端会将该内容发送给所有在线用户,实现实时聊天的功能。

示例二:实现Web控制器

Web控制器是一个典型的Websocket应用场景,下面我们将使用Websocket++库来实现一个简单的Web控制器,实现对连接设备的遥控操作。

该Web控制器的具体实现逻辑如下:

  • 用户在Web页面上点击相应的操作按钮后,前端将该操作信息封装为JSON格式并发送给后端;
  • 后端接收到JSON格式的控制信息后,对该设备进行相应的操作并将结果返回给前端。

下面是详细的实现代码:

服务端实现:

#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
#include <iostream>
#include <string>
#include <json.hpp>

using namespace std;
using json = nlohmann::json;

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

// 模拟设备状态
string device_state = "off";

void on_message(server *sm, websocketpp::connection_hdl hdl, server::message_ptr msg) {
    // 解析JSON格式的消息
    json j = json::parse(msg->get_payload());

    // 根据操作类型进行相应的操作
    if (j["type"] == "get_status") {
        json res;
        res["type"] = "status_reply";
        res["state"] = device_state;
        sm->send(hdl, res.dump(), msg->get_opcode());
    } else if (j["type"] == "set_status") {
        device_state = j["state"];
        json res;
        res["type"] = "status_updated";
        res["state"] = device_state;
        for(auto it=sm->get_connections().begin(); it!=sm->get_connections().end(); it++) {
            sm->send(*it, res.dump(), msg->get_opcode());
        }
    }
}

int main() {
    try {
        // 创建服务器
        server ws_server;

        // 设置事件处理函数
        ws_server.set_message_handler(bind(&on_message, &ws_server, ::_1, ::_2));

        // 设置监听端口
        ws_server.listen(9002);

        cout << "WebSocket Server started on port 9002" << endl;

        // 进入事件循环
        ws_server.run();
    } catch (const websocketpp::exception& e) {
        cerr << "Error: " << e.what() << endl;
    } catch (...) {
        cerr << "Exception caught" << endl;
    }
    return 0;
}

客户端实现:

#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/client.hpp>
#include <iostream>
#include <string>
#include <json.hpp>

using namespace std;
using json = nlohmann::json;

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

void on_message(client *c, websocketpp::connection_hdl hdl, client::message_ptr msg) {
    // 解析JSON格式的消息
    json j = json::parse(msg->get_payload());

    // 根据消息类型进行相应的处理
    if (j["type"] == "status_reply") {
        cout << "Device state: " << j["state"] << endl;
    } else if (j["type"] == "status_updated") {
        cout << "Device state updated: " << j["state"] << endl;
    }
}

int main() {
    try {
        // 创建客户端
        client ws_client;

        // 设置事件处理函数
        ws_client.set_message_handler(bind(&on_message, &ws_client, ::_1, ::_2));

        // 设置连接地址
        string uri = "ws://localhost:9002";

        // 连接WebSocket服务器
        websocketpp::lib::error_code ec;
        client::connection_ptr conn = ws_client.get_connection(uri, ec);
        if (ec) {
            cerr << "Could not connect: " << ec.message() << endl;
            return 1;
        }
        ws_client.connect(conn);

        // 向服务端发送消息
        json msg;
        msg["type"] = "get_status";
        ws_client.send(conn, msg.dump(), websocketpp::frame::opcode::text);

        // 进入事件循环
        ws_client.run();
    } catch (const websocketpp::exception& e) {
        cerr << "Error: " << e.what() << endl;
    } catch (...) {
        cerr << "Exception caught" << endl;
    }
    return 0;
}

启动服务端程序后,运行客户端程序,即可通过该Web控制器对设备进行遥控操作,实现远程控制的功能。

总结

本文介绍了Websocket++库的简单使用方法和两个典型应用场景的实现。 Websocket++库是一个功能强大、易于使用、高效稳定的WebSocket库,具有广泛的应用场景,特别适合于实时通信、远程控制等领域。希望本文能够对读者理解Websocket++库的特点和优势有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:websocket++简单使用及实例分析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Three.js实现雪糕地球的使用示例详解

    首先,为了使用Three.js实现雪糕地球,我们需要在网站中引入Three.js库,可以通过以下代码在HTML文件中引入: <script src="./js/three.min.js"></script> 为了呈现一个球形地球,我们使用Three.js中的球体(SphereGeometry)并将其放置在场景(Sc…

    JavaScript 2023年6月11日
    00
  • Javarscript中模块(module)、加载(load)与捆绑(bundle)详解

    Javascript中模块(module)、加载(load)与捆绑(bundle)详解 Javascript的模块化开发在现代Web开发中已经成为了标准配置。在Javascript的模块化开发中,常见的术语包括模块、加载和捆绑。 模块(Module) 模块是Javascript中包含一组功能的单独文件或代码块。每个模块都拥有自己的作用域,并且只对外暴露为公共…

    JavaScript 2023年5月27日
    00
  • JavaScript 实现網頁打印處理

    要在网页上实现打印功能,可以使用 JavaScript 来控制页面的打印行为。下面是一些实现网页打印的攻略: 1. 使用 window.print 方法 window.print() 是 JavaScript 的内置方法,用于打开浏览器的打印框架并弹出打印对话框。为了使打印结果更好的呈现,建议在打印前设置适当的 CSS 样式,以适应打印机的纸张格式。 示例 …

    JavaScript 2023年5月19日
    00
  • JavaScript Math对象使用方法

    JavaScript中的Math对象是一个内置的对象,提供了许多数学计算方法和常数。Math对象中的所有方法和常数都是静态的,意味着你不需要创建一个Math对象就可以使用这些方法和常数。下面是Math对象中一些常用的方法和常数以及示例代码。 1. Math.PI Math.PI表示圆周率,它是一个不变的数值,约等于3.141592653589793。你可以通…

    Web开发基础 2023年3月30日
    00
  • JS选取DOM元素常见操作方法实例分析

    针对“JS选取DOM元素常见操作方法实例分析”的攻略,我会给出完整的文本,涵盖标题、代码块等规范要求,并且会提供两个示例。 JS选取DOM元素常见操作方法实例分析 在前端开发中,JS能够操作DOM元素是非常重要的技能之一。在进行DOM操作时,首先需要选取相应的DOM元素。JS有多种方法可以选取DOM元素。接下来,我们将介绍一些常用的DOM选取方法。 通过id…

    JavaScript 2023年6月10日
    00
  • jquery validation验证身份证号,护照,电话号码,email(实例代码)

    下面是“jquery validation验证身份证号,护照,电话号码,email”的完整攻略: 1. 引入jQuery和jQuery Validation插件 首先需要引入jQuery和jQuery Validation插件的js文件和css文件: <!– 引入jQuery –> <script src="https://c…

    JavaScript 2023年6月10日
    00
  • JavaScript代码实现简单日历效果

    JavaScript代码实现简单日历效果 引言 日历是人们生活中必不可少的一部分,Javascript通过操作DOM元素以及CSS样式,实现了多种简单的日历效果。本文将详细介绍JavaScript如何实现一个简单的日历效果。 分析与目标 首先,我们要对一个日历的样式进行分析,发现日历主要是由星期和日期构成的,其次各个日期的显示状态需通过计算天数来完成。 所以…

    JavaScript 2023年5月27日
    00
  • 深入理解JavaScript字节二进制知识以及相关API

    深入理解JavaScript字节二进制知识以及相关API 为什么需要了解字节和二进制? 在前端开发中,我们经常会遇到需要处理二进制数据的场景,例如图片加载、加密算法、数据压缩等等。在这些场景下,我们必须对字节和二进制有深刻的理解,才能够正确地处理和操作数据。 字节和二进制的概念 从计算机的角度来看,数据和指令都是二进制串。直接以二进制串的形式进行数据处理和传…

    JavaScript 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部