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日

相关文章

  • 详解JS内存空间

    下面是详解JS内存空间的完整攻略。 什么是JS内存空间 JS内存空间是指JS程序运行时候所使用的内存区域。这个内存区域分为两个部分:栈内存和堆内存。在JS程序运行时,变量和函数都要被存储在内存空间中,以便被调用和使用。 栈内存和堆内存 栈内存 栈内存是以FIFO(先进先出)的方式存储数据的,它的存储方式和变量的生命周期有关系。当一个函数被调用时,会自动在栈内…

    JavaScript 2023年6月11日
    00
  • 如何利用JavaScript编写更好的条件语句详解

    当我们在编写JavaScript程序时,条件语句是非常常见的操作之一。在使用条件语句时,我们需要注意一些细节,如代码的可读性、运行效率、逻辑的正确性等方面。下面我将详细讲解如何利用JavaScript编写更好的条件语句。 使用清晰的变量名和注释 在编写条件语句时,我们应该使用清晰的变量名来描述条件,避免使用一些简短、难以理解的变量名。同时,在必要的时候使用注…

    JavaScript 2023年5月28日
    00
  • Electron vue的使用教程图文详解

    Electron Vue的使用教程图文详解 Electron Vue是一款基于Electron和Vue的框架,可以用于快速构建桌面应用。本文将详细讲解如何使用Electron Vue构建桌面应用程序。 前置条件 在开始使用Electron Vue之前,需要具备以下技能和工具: 基本的HTML、CSS和JavaScript技能 Vue.js的基础知识 Node…

    JavaScript 2023年6月11日
    00
  • JS+Canvas实现满屏爱心和文字动画的制作

    接下来我将详细讲解“JS+Canvas实现满屏爱心和文字动画的制作”的完整攻略。 准备工作 创建 HTML 页面,并引入 Canvas 标签。 “`html Canvas Demo “` 在 JavaScript 文件中获取 Canvas 对象并设置宽高。 javascript var canvas = document.getElementById(“…

    JavaScript 2023年6月11日
    00
  • JavaScript中this的用法实例分析

    使用JavaScript中的this关键字可以引用当前对象,这在许多情况下是非常有用的。在本文中,我们将学习this的用法实例分析。 什么是this? this关键字是JavaScript中的一种关键字,它被用来引用当前对象。简单来说,this关键字是一个指向当前正在执行的代码所在的对象的指针。 在对象中,this指向该对象本身。在函数中,this指向其调用…

    JavaScript 2023年5月28日
    00
  • js console.log打印对像与数组用法详解

    接下来我将为您详细讲解js中console.log打印对象与数组的用法,以及两个样例说明。 什么是console.log console.log()是Javascript中用来打印信息到控制台(console)的方法。我们可以在控制台里面看到我们传递给console.log()方法的参数。 打印对象 当我们需要打印一个对象时,我们可以直接传入对象参数给con…

    JavaScript 2023年5月27日
    00
  • PHP的Yii框架的基本使用示例

    下面是关于“PHP的Yii框架的基本使用示例”的完整攻略。 一、什么是Yii框架? Yii框架是一个高性能的、基于组件的PHP框架,它具有良好的扩展性和灵活性,是一个适用于Web应用开发的框架。Yii框架可以让开发者在减少重复性工作的同时,保持代码的规范和可读性。 二、Yii框架的安装 首先,我们需要安装Yii框架,可以通过Composer来进行安装,执行以…

    JavaScript 2023年6月11日
    00
  • vue常用组件之confirm用法及说明

    Vue常用组件之confirm用法及说明 介绍 confirm组件是Vue中常用的弹窗组件,类似于浏览器内置的confirm函数,它可以方便地呈现一个确认框。该组件由Vuetify提供,它是一个基于Material Design规范的Vue UI库。 安装与使用 你可以使用npm或yarn来安装该组件: npm install vuetify –save …

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