C++下轻量化websocket客户端库——easywsclient的使用

这篇具有很好参考价值的文章主要介绍了C++下轻量化websocket客户端库——easywsclient的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、背景介绍

1.1 WebSocket介绍

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
c++ websocket 客户端,python、C++与C#实践,c++,websocket,开发语言

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

1.2 WebSocket 属性

连接状态属性

以下是 WebSocket 对象的属性:
0 - 表示连接尚未建立。
1 - 表示连接已建立,可以进行通信。
2 - 表示连接正在进行关闭。
3 - 表示连接已经关闭或者连接不能打开。

Socket.bufferedAmount
只读属性 bufferedAmount 为True表示信息已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

WebSocket 事件

以下是 WebSocket 对象的相关事件:
事件 事件处理程序 描述
open Socket.onopen 连接建立时触发
message Socket.onmessage 客户端接收服务端数据时触发
error Socket.onerror 通信发生错误时触发
close Socket.onclose 连接关闭时触发

WebSocket 方法

以下是 WebSocket 对象的相关方法,用于信息发生与连接

方法 描述
Socket.send() //使用连接发送数据
Socket.close() //关闭连接

1.3 easywsclient介绍

websocket并不局限于在网页端(JS客户端使用),其还支持在各个后端中使用,如C++、Java等
easywsclient是一个基于C++11的轻量化标注websocket客户端库(跨平台,支持各种系统),支持RFC 6455版本13 WebSocket,兼容现行所有的WebSocket服务器(如c++ crow库的WebSocket服务端)。对于socketio的服务器兼容存在问题,应使用socketio的客户端。
项目地址: https://github.com/dhbaird/easywsclient

2、easywsclient使用

2.1 代码介绍

easywsclient项目核心代码为"easywsclient.hpp"和"easywsclient.cpp",仅需将这两个文件拷贝到自己项目下即可使用WebSocket客户端通信了。
其关键接口函数有以下4个,send函数用于发送文本信息,sendBinary函数用于发送二进制信息,dispatch用于设置信息接收处理的函数

        ws->poll();
        ws->send("hello");
        //ws->sendBinary(vp);
        ws->dispatch(handle_message);

2.2 基本使用

使用easywsclient主要是要指定dispatch函数,可以在dispatch函数中对服务器返回的信息进行处理,也可以在此处断开WebSocket连接

#include "easywsclient.hpp"
//#include "easywsclient.cpp" // <-- include only if you don't want compile separately
using easywsclient::WebSocket;
WebSocket::pointer ws;
void handle_message_close(const std::string& message)
{
    ws->close();
}
int
main()
{
#ifdef _WIN32
    INT rc;
    WSADATA wsaData;

    rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (rc) {
        printf("WSAStartup Failed.\n");
        return 1;
    }
#endif
    ws = WebSocket::from_url("ws://localhost:8126/foo");
    assert(ws);
    while (websocketclient->getReadyState() != WebSocket::CLOSED) {
        ws->poll();
        ws->send("hello");
        ws->dispatch(handle_message_close);
    }
    ...
    delete ws; // alternatively, use unique_ptr<> if you have C++11

#ifdef _WIN32
    WSACleanup();
#endif
    return 0;
}

2.3 发送二进制数据

需要调用sendBinary函数,其入参为std::vector<uint8_t>类型。其支持将多种数据类型进行拼接,允许一次性传入多个数据(使用memcpy将数据复制到对应内存位置即可)。

        long dsize =  sizeof(int) +sizeof(char) * txt_data.size() ;
        uint8_t* buffer; 
        buffer = (uint8_t*)malloc(sizeof(uint8_t) * dsize);
        memcpy(buffer, 123456, sizeof(int));
        memcpy(buffer+sizeof(int), txt_data.data(), sizeof(char)*txt_data.size());
        std::vector<uint8_t> vp(buffer, buffer + dsize);

        ws->poll();
        ws->sendBinary(vp);

        //可以将二进制数据保存下来,与服务器端进行验证
        ofstream fout("send.dat", ios::binary);
        fout.write(reinterpret_cast<const char*>(buffer), sizeof(uint8_t) * dsize);
        fout.close();

3、websocket服务器

在c++下搭建websocket服务器需要依赖其他的第三方库,这里初略介绍一下2个可以实现websocket服务器的c++库

3.1 使用websocketpp库

websocketpp库下载地址为:https://github.com/zaphoyd/websocketpp/,其依赖Boost库。故此,在导入websocketpp库前,需要先导入Boost库。websocketpp库也支持websocket客户端,但考虑到依赖的库更多了,还是推荐使用easywsclient库

#include <websocketpp/config/asio_no_tls.hpp>
 
#include <websocketpp/server.hpp>
 
#include <iostream>
 
typedef websocketpp::server<websocketpp::config::asio> server;
 
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
 
// 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) {
    std::string cmd = msg->get_payload();
    std::string res = "fu wu qi de xin xi! \" ";
 
    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;
    }
 
    try {
        s->send(hdl, res, msg->get_opcode());
    } catch (websocketpp::exception const & e) {
        std::cout << "Echo failed because: "
                  << "(" << e.what() << ")" << std::endl;
    }
}
 
int main() {
    // Create a server endpoint
    server echo_server;
 
    try {
        // Set logging settings
        echo_server.set_access_channels(websocketpp::log::alevel::all);
        echo_server.clear_access_channels(websocketpp::log::alevel::frame_payload);
 
        // Initialize Asio
        echo_server.init_asio();
 
        // Register our message handler
        echo_server.set_message_handler(bind(&on_message,&echo_server,::_1,::_2));
 
        // Listen on port 9002
        echo_server.listen(9002);
 
        // Start the server accept loop
        echo_server.start_accept();
 
        // Start the ASIO io_service run loop
        echo_server.run();
    } catch (websocketpp::exception const & e) {
        std::cout << e.what() << std::endl;
    } catch (...) {
        std::cout << "other exception" << std::endl;
    }
}

详情可以参考:https://hpg123.blog.csdn.net/article/details/124888325

3.2 使用crow库

corw是一个开源、轻量化的c++web库,在使用上与python的flask是类似的,其支持路由绑定、返回数据(json、文本、response对象(静态资源、模板文件)、接口请求处理(REST请求,url参数绑定、json请求、GET参数和POST
参数)和各种高级操作(Cookie操作、Session操作、文件上传操作、文件下载操作、websocket
操作、自定义loghandler)。此外,还对各类参数请求、结果返回过程中对中文的支持(如get
参数、post参数、url参数、json结果中中文参数的正确解读)。其使用文档的下载地址为:https://download.csdn.net/download/a486259/87471152文章来源地址https://www.toymoban.com/news/detail-651932.html

#include "crow.h"
#include <unordered_set>
#include <mutex>
int main()
{
	crow::SimpleApp app;
	std::mutex mtx;
	std::unordered_set<crow::websocket::connection*> users;
	CROW_WEBSOCKET_ROUTE(app, "/ws")
		.onopen([&](crow::websocket::connection& conn) {
			CROW_LOG_INFO << "new websocket connection from " << conn.get_remote_ip();
			std::lock_guard<std::mutex> _(mtx);
			users.insert(&conn);
		})
		.onclose([&](crow::websocket::connection& conn, const std::string& reason) {
			CROW_LOG_INFO << "websocket connection closed: " << reason;
			std::lock_guard<std::mutex> _(mtx);
			users.erase(&conn);
		})
		.onmessage([&](crow::websocket::connection& /*conn*/, const std::string& data, bool is_binary){
			std::lock_guard<std::mutex> _(mtx);
			//给当前用户发信息
			conn.send_text(data);
			//给所有用户发信息
			for (auto u : users){
			if (is_binary){
			u->send_binary(data);
			}else{
			u->send_text(data);
	});
	CROW_ROUTE(app, "/")
	([] {
		char name[256];
		gethostname(name, 256);
		crow::mustache::context x;
		x["servername"] = name;
		auto page = crow::mustache::load("ws.html");
		return page.render(x);
	});
}

到了这里,关于C++下轻量化websocket客户端库——easywsclient的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++实现websocket服务端客户端(基于boost,亲测可行!)

       整篇文章基本参考了https://blog.csdn.net/jianghuan0122/article/details/123528907,文章记录了如何在现有条件下实现该参考示例(参考示例存在报错,并且参考示例没有介绍环境安装,正确源码附于文末)    自身环境:ubuntu18.04+gcc7.5.0+boost1.7,3   gcc或者g++一般都有,这里主要介绍

    2024年02月11日
    浏览(43)
  • 客户端 WebSocket详细用法

    WebSocket是一种网络通信协议,很多高级功能都需要用到它。 有些人会想,既然我们已经有了HTTP协议了,为什么还要花时间学另一种协议呢?这个协议到底有什么魔力,值得我们花时间学它。 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。只能是客户端向服务器发出请求

    2024年02月04日
    浏览(43)
  • Java WebSocket客户端

    1.依赖 2.代码 1.依赖 2.代码 2.1 自定义 websocket handler 2.2 将websocket handler加入容器 2.3 定时器监控

    2024年02月16日
    浏览(41)
  • Java实现websocket客户端

    常规情况下,大多数时候Java后台作为websocket服务端,实现方式也比较简单,网上很多案例代码。但是很多时候项目中服务与服务之间也需要使用websocket通信,此时项目就需要实现客户端功能。 步骤一:导入依赖: 步骤二:实现WebSocketClient抽象类: 该类中和websocket服务端接口

    2024年02月16日
    浏览(58)
  • websocket客户端实现(java)

    其中,headers 参数是一个键值对,表示需要设置的请求头。在构造函数中,我们首先创建了一个 ClientEndpointConfig.Configurator 对象,重写了其中的 beforeRequest() 方法,用于在请求之前设置请求头。然后,我们使用 ClientEndpointConfig.Builder.create() 方法创建一个 ClientEndpointConfig 对象,并

    2024年02月15日
    浏览(46)
  • SpringBoot WebSocket做客户端

    常见的都是springboot应用做服务,前端页面做客户端,进行websocket通信进行数据传输交互。但其实springboot服务也能做客户端去连接别的webSocket服务提供者。 刚好最近在项目中就使用到了,需求背景大概就是我们作为一个java段应用需要和一个C语言应用进行通信。在项目需求及

    2024年02月11日
    浏览(45)
  • 做个小工具-WebSocket客户端

    由于工作的原因经常需要用到一些socket,串口等调试工具,但是好多工具要么只有其中几个或者各种收费,不断提醒捐助等。所以还是自己做一个吧。毕竟也不复杂。今天先做个WebSocket客户端。WebSocket使用了开源组件WatsonWebsocket。 先上图 View的代码 ViewModel的代码 servervice的代

    2024年02月15日
    浏览(36)
  • 快速搭建springboot websocket客户端

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。 HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。 浏览器通过 JavaSc

    2024年02月06日
    浏览(57)
  • python用websockets创建服务端websocket创建客户端

    服务端 客户端

    2024年02月22日
    浏览(54)
  • SpringBoot+WebSocket实现服务端、客户端

    小编最近一直在使用springboot框架开发项目,毕竟现在很多公司都在采用此框架,之后小编也会陆续写关于springboot开发常用功能的文章。 什么场景下会要使用到websocket的呢? websocket主要功能就是实现网络通讯,比如说最经典的客服聊天窗口、您有新的消息通知,或者是项目与

    2024年02月13日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包