消息中间件 Asio (C++)

在这里插入图片描述
折腾了一上午,看到这个结果的时候泪目了兄弟闷,讲真。我的asio客户端成功收到服务端发来的消息了。虽然这确实是极其智障又简单的入门哈哈

  1. 下载独立版本 asio网络通信库
  2. 新建cmake工程,CMakeLists.txt加载asio
  3. asio最简单的服务端和客户端代码编写

下载独立版本 asio网络通信库

链接:https://pan.baidu.com/s/1T3aUf3yZbn0nTGi19_RqYA
提取码:1234

文件7zip压缩包,下载用7zip解压,就是一个asio文件夹,里面包含了asio所有头文件源码。独立版的asio是header-only,所以使用时只需包含头文件即可。把解压得到的asio文件夹放到项目目录里。

新建cmake工程,CMakeLists.txt加载asio

VS新建CMake工程或VSCode新建CMake工程都可以。编写CMakeLists.txt将下载解压的asio文件夹添加到头文件搜索目录里,用工程main函数将服务端和客户端的源码文件链接生成可执行文件即可。
在这里插入图片描述
CMakeLists.txt源码

# CMakeList.txt: CMakeProject1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)project ("CMakeProject1")## 威力很大
include_directories(/asio)# 将源代码添加到此项目的可执行文件。
add_executable (CMakeProject1  CMakeProject1.cpp CMakeProject1.h)if (CMAKE_VERSION VERSION_GREATER 3.12)set_property(TARGET CMakeProject1 PROPERTY CXX_STANDARD 20)
endif()

asio最简单的服务端和客户端代码编写

asio简单的服务端和客户端的代码网上一搜一帕拉,也可参照以下代码编写。
服务端代码

		try{asio::io_service io_service;tcp::acceptor acceptor(io_service, tcp::endpoint(asio::ip::address::from_string("127.0.0.1"), 2121));for (;;){tcp::socket socket(io_service);acceptor.accept(socket);asio::write(socket, asio::buffer(std::string("欢迎来到 Asio的世界! 我们一起愉快地探索下去吧!")));}}catch (std::exception& e){std::cerr << e.what() << std::endl;}

客户端代码

		try{asio::io_service io_service;tcp::resolver resolver(io_service);tcp::resolver::query query("127.0.0.1", "2121");tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);tcp::endpoint endpoint = *endpoint_iterator;std::cout << endpoint << "\n\n";tcp::socket socket(io_service);asio::connect(socket, endpoint_iterator);for (;;){array<char, 128> buf;buf.fill('\0');size_t len = socket.read_some(asio::buffer(buf));std::cout << buf.data() << std::endl;}}catch (std::exception& e){std::cerr << e.what() << std::endl;}

CMakeProject1.cpp 完整源文件

// CMakeProject1.cpp: 定义应用程序的入口点。
//#include "CMakeProject1.h"using namespace std;#include "./asio/asio.hpp"using asio::ip::tcp;
#include <ctime> 
#include <iostream> 
#include <string> 
#include <iostream> int main(int argc, char* argv[])
{#if 0asio::io_context io;asio::steady_timer t(io, asio::chrono::seconds(5));t.async_wait(&print);std::cout << "hh" << std::endl;io.run();
#endifstd::string input;std::cin >> input;if (input.compare("server") == 0){try{asio::io_service io_service;tcp::acceptor acceptor(io_service, tcp::endpoint(asio::ip::address::from_string("127.0.0.1"), 2121));for (;;){tcp::socket socket(io_service);acceptor.accept(socket);asio::write(socket, asio::buffer(std::string("欢迎来到 Asio的世界! 我们一起愉快地探索下去吧!")));}}catch (std::exception& e){std::cerr << e.what() << std::endl;}}else if(input.compare("client") == 0){try{asio::io_service io_service;tcp::resolver resolver(io_service);tcp::resolver::query query("127.0.0.1", "2121");tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);tcp::endpoint endpoint = *endpoint_iterator;std::cout << endpoint << "\n\n";tcp::socket socket(io_service);asio::connect(socket, endpoint_iterator);for (;;){array<char, 128> buf;buf.fill('\0');size_t len = socket.read_some(asio::buffer(buf));std::cout << buf.data() << std::endl;}}catch (std::exception& e){std::cerr << e.what() << std::endl;}std::cout << "\n\n";}return 0;
}

VS的cmake项目小技巧
可以对项目右键点击选择右键菜单“在终端中打开”,打开终端,输入命令开启服务端或客户端。如果是开发网络通信小Demo,服务端和客户端放在一个工程中,通过终端输入命令参数,选择开启服务器或客户端比新建两个VS工程要简单方便些,铁汁闷。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/34290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)

SpringBoot集成websocket&#xff08;3&#xff09;|&#xff08;websocket调用websocket采用回调方式实现数据互传&#xff09; 文章目录 SpringBoot集成websocket&#xff08;3&#xff09;|&#xff08;websocket调用websocket采用回调方式实现数据互传&#xff09;[TOC] 前…

Vue引入外部js文件中的变量,方法

写法一&#xff1a; vue文件 <template><div class"index"><div>{{zuopin}}</div><h2>{{content.name}}</h2><h2>{{content.title}}</h2><div class"box" v-for"item in info" :key"…

Java技术整理(6)—— 微服务篇

1、服务注册发现 服务注册就是维护一个服务列表&#xff0c;它在管理系统内所有的服务地址&#xff0c;当新的服务启动后&#xff0c;它会向服务列表提交自己的服务地址&#xff0c;服务的调用法可以直接向服务列表发送服务列表获取请求&#xff0c;就能获得所有的服务地址&am…

【LangChain】Prompts之示例选择器

LangChain学习文档 【LangChain】向量存储(Vector stores)【LangChain】向量存储之FAISS【LangChain】Prompts之Prompt templates【LangChain】Prompts之自定义提示模板【LangChain】Prompts之示例选择器 概要 如果您有大量示例&#xff0c;您可能需要选择要包含在提示中的哪…

pytest功能特性介绍

前言 学pytest就不得不说fixture&#xff0c;fixture是pytest的精髓所在&#xff0c;就像unittest中的setup和teardown一样&#xff0c;如果不学fixture那么使用pytest和使用unittest是没什么区别的(个人理解)。 fixture用途 1.做测试前后的初始化设置&#xff0c;如测试数据…

【AI】《动手学-深度学习-PyTorch版》笔记(十七):卷积神经网络入门

AI学习目录汇总 1、从全链接层到卷积 1.1 卷积 我们在前面学习的多层感知机中,已经认识了全链接层,缺点很明显,在稍微大点的网络模型中,参数成指数级别增长。参数量很快就达到数十亿,这样的量级几乎无法计算。为此科学家们想出一个减少参数的方法:卷积。 从全链接层到…

Android Monkey测试

1.直接使用 当配置好一切环境的前提下&#xff0c;仅需套用以下基础语法&#xff0c;即可简单使用(更多的命令可以去Android的官网查询) adb shell monkey -p [包名] -v [需要点击的次数] 举例&#xff0c;如我这里的包名是 com.test.chj233 &#xff0c;需要随机生成 1万次…

linux 关机和重启

关机和重启 关机和重启之前最好先数据数据同步一下 # 将数据由内存同步到硬盘sync 关机 #shutdown [选项] 时间#立即进入维护模式shutdown now#立即重启shutdown -r now#20:00 重新启动计算机shutdown -r 20:00& #立即关机shutdown -h now# 20:00 关闭计算机shutdown -h 20…

K8S系列文章之 Shell批处理脚本应用

一、简要说明 1、批处理脚本介绍 命令批处理脚本&#xff1a;/usr/shell/all.sh文件批量分发脚本&#xff1a;/usr/shell/scp.sh 2、批处理命令脚本原理 读取/usr/shell/hosts文件中的ip列表使用$*接收脚本所有参数for循环遍历hosts文件中的ip地址通过ssh host cmd 实现目的…

【elasticSearch系】3.完整搭建详尽版elk

话不多说,我们先看下经典的elk 是由哪些组件搭建组合起来的 elasticSearch和kibana搭建 可以查看之前我搭建elasticsearch和kibana 的这篇文章 logstash搭建 为了和之前我搭建elasticsearch和kibana版本保持一致,这里我们还是选择7.17.3 下载地址 点击下载,这里为了方…

wangEditor5实现@评论功能

需求描述&#xff1a;在输入框输入后显示用户列表&#xff0c;实现人功能 当前环境&#xff1a;vue3viteelementPluswangEditor5 需要插件&#xff1a;wangeditor/plugin-mention 安装插件&#xff1a;npm i wangeditor/plugin-mention 输入框组件分两部分&#xff1a;1. wa…

谈谈对Spring MVC的理解

问题分析&#xff1a; SpringMVC 是一种基于 Java 语言开发&#xff0c;实现了 Web MVC 设计模式&#xff0c;请求驱动类型 的轻量级 Web 框架。 SpringMVC采用了 MVC 架构模式的思想&#xff0c;通过把 Model&#xff0c;View&#xff0c;Controller 分离&#xff0c;将 Web 层…

基于vue3+webpack5+qiankun实现微前端

一 主应用改造&#xff08;又称基座改造&#xff09; 1 在主应用中安装qiankun(npm i qiankun -S) 2 在src下新建micro-app.js文件&#xff0c;用于存放所有子应用。 const microApps [// 当匹配到activeRule 的时候&#xff0c;请求获取entry资源&#xff0c;渲染到containe…

软件测试基础篇——MySQL

MySQL 1、数据库技术概述 数据库database&#xff1a;存放和管理各种数据的仓库&#xff0c;操作的对象主要是【数据data】&#xff0c;科学的组织和存储数据&#xff0c;高效的获取和处理数据SQL&#xff1a;结构化查询语言&#xff0c;专为**关系型数据库而建立的操作语言&…

JavaScript类

JavaScript 类(class) 类是用于创建对象的模板。 我们使用 class 关键字来创建一个类&#xff0c;类体在一对大括号 {} 中&#xff0c;我们可以在大括号 {} 中定义类成员的位置&#xff0c;如方法或构造函数。 每个类中包含了一个特殊的方法 constructor()&#xff0c;它是类…

vue3项目中引入dialog插件,支持最大最小化、还原、拖拽

效果图&#xff1a; 上图是layui-vue组件库中的layer插件&#xff0c;我的项目使用的是element-plus组件库&#xff0c;在用不上layui组件库的情况下&#xff0c;就单独引入layui/layer-vue这个弹层插件就可以了 npm地址&#xff1a;layui/layer-vue - npm layui-vue组件库地址…

UnrealEngine - 网络同步之连接篇

1 连接过程 - 握手 传统的 C/S 架构下&#xff0c;Client 和 Server 通常会建立一条抽象的 Connection&#xff0c;用来进行两端的通信。 UE 的官方文档中提供了 Client 连接到 Server 的示例 &#xff0c;简单来说分为如下几步&#xff1a; 打包构建好 Client 和 Server 进程…

11-数据结构-栈和队列的应用(C语言)

栈和队列的应用 目录 栈和队列的应用 一、括号匹配&#xff08;栈&#xff09; 二、表达式的各种转换 (1)中缀转后缀(手工) (2)后缀转中缀表达式(手工) (3)中缀转后缀(栈) (4)中缀转后缀&#xff08;树&#xff09; (5)后缀表达式求值 (6)中缀表达式求值&#xff08;栈…

EasyExcel多次写入数据多个EasyExcel文件导出到zip压缩文件

笔者最近需要导出一百多万条数据到Excel&#xff0c;已经超出单张工作表的最大容量&#xff08;2^201048576&#xff09;&#xff0c;需要导出到多个工作表或多个Excel文件。 海量数据导出面临的问题有以下几个&#xff1a; 如果一次性查出所有数据&#xff0c;很可能内存溢出…

jackson库收发json格式数据和ajax发送json格式的数据

一、jackson库收发json格式数据 jackson库是maven仓库中用来实现组织json数据功能的库。 json格式  json格式一个组织数据的字符文本格式&#xff0c;它用键值对的方式存贮数据&#xff0c;json数据都是有一对对键值对组成的&#xff0c;键只能是字符串&#xff0c;用双引号包…