当前位置: 首页 > news >正文

C++ asio网络编程(5)简单异步echo服务器

上一篇文章:C++ asio网络编程(4)异步读写操作及注意事项

文章目录

  • 前言
  • 一、Session类
    • 1.代码
    • 2.代码详解
    • 3.实现Session类
      • 1.构造函数
      • 2.handle_read
      • 3.介绍一下boost的封装函数和api
      • 4.handle_write
  • 二、Server类
    • 1.代码
    • 2.代码思路详解
  • 三、客户端
  • 四、运行截图与流程图


前言

提示:这里可以添加本文要记录的大概内容:

前文已经介绍了异步操作的api,今天写一个简单的异步echo服务器,以应答为主
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、Session类

Session类主要是处理客户端消息收发的会话类,为了简单起见,我们不考虑粘包问题,也不考虑支持手动调用发送的接口只以应答的方式发送和接收固定长度(1024字节长度)的数据。

1.代码

#pragma once
#include<iostream>
#include<boost/asio.hpp>
using boost::asio::ip::tcp;class Session
{Session(boost::asio::io_context& ioc) :_socket(ioc){};tcp::socket& Socket(){return _socket;}void Start();//监听客户端的读写private://回调函数void handle_read(const boost::system::error_code& ec,size_t bytes_transferred);void handle_write(const boost::system::error_code& ec, size_t bytes_transferred);tcp::socket _socket;enum {max_length=1024};char _data[max_length];
};

2.代码详解

1.构造函数中传入一个上下文用来绑定socket
2.Start()用来监听客户端是否发来信息
3.回调函数中 handle_read 是读的回调函数,我们这里用上一个文章介绍的async_read_some
因为不会一次性读完,所以我们有第二个参数来显示已经读了多少数据
4.回调函数中的handle_write是写的回调函数,我们用boost::asio::async_write来一次性发送数据
5. _data用来接收客户端传递的数据
6. _socket为单独处理客户端读写的socket

3.实现Session类

1.构造函数

我们在构造函数中把数组初始化为0,然后直接调用读函数就行,他会一直等着,当用户发送数据,tcp底层有内容的时候,就会进行读

void Session::Start()
{memset(_data, 0, sizeof(_data));_socket.async_read_some(boost::asio::buffer(_data, max_length),std::bind(&Session::handle_read, this, placeholders::_1, placeholders::_2));
}

然后读了以后,我们要进行回调函数
这个回调函数的参数是两个的原因是因为源码中async_read_some要求了回调函数参数如下
在这里插入图片描述

2.handle_read

//读的回调函数
void Session::handle_read(const boost::system::error_code& ec, size_t bytes_transferred)
{if (ec)//0正确  1错误{cout << "read error" << endl;delete this;}else{cout << "server receivr data is "<<_data << endl;//将收到的数据发送回去boost::asio::async_write(_socket, boost::asio::buffer(_data, bytes_transferred),std::bind(&Session::handle_write,this, placeholders::_1, placeholders::_2));}
}

读完以后我们打印一下收到的数据
然后原封不动的将这个数据发送回去就行

我们用boost::asio::async_write来发送,这样可以保证数据一次性发送完,但其实用socket自带也都行,因为我们这样只做一个简单的应答式的而已,本身就不会出现长数据,只是一个模型而已,但这里用一个boost库自带的封装函数,就是为了介绍一下!!!!!!!!!!!!!!!!!!!!!

3.介绍一下boost的封装函数和api

在这里插入图片描述
在这里插入图片描述

参数列表有三个,第一个绑定socket,第二个传入的buffer,第三个std::bind

4.handle_write

在之前读完以后我们就准备将数据发送回去,所以就写,写的时候也调用我们这个回调函数,参数的原因与上面同理,查看源码即可

//写的回调函数
void Session::handle_write(const boost::system::error_code& ec, size_t bytes_transferred)
{ if (ec)//0正确  1错误{cout << "write error" << endl;delete this;}else{//发完了 就清除掉原先的memset(_data, 0, sizeof(_data));//继续读_socket.async_read_some(boost::asio::buffer(_data, bytes_transferred),std::bind(&Session::handle_read, this, placeholders::_1, placeholders::_2));}
}

二、Server类

这个用来管理客户端连接的,我们初始化一个监听器,当有客户端进行连接的时候,我们就内部new一个Session去单独服务这个客户端

1.代码

class Server
{
public:Server(boost::asio::io_context& ioc, short port);private:void start_accept();//监听连接void handle_accept(Session* new_session, const boost::system::error_code& ec);//当有连接的时候触发这个回调函数boost::asio::io_context& _ioc;//因为上下文不允许被复制 所以用引用tcp::acceptor _acceptor;
};
Server::Server(boost::asio::io_context& ioc, short port) :_ioc(ioc), _acceptor(ioc, tcp::endpoint(tcp::v4(), port))
{start_accept();
}void Server::start_accept()
{Session* new_session = new Session(_ioc);_acceptor.async_accept(new_session->Socket(),std::bind(&Server::handle_accept,this,new_session,placeholders::_1));
}void Server::handle_accept(Session* new_session, const boost::system::error_code& ec)
{if (!ec)//成功{new_session->Start();}else{delete new_session;}start_accept();//再次准备
}

2.代码思路详解

首先我们初始化一个上下文ioc准备好,因为创建一个socket连接需要这个东西
然后我们调用这个函数start_accept()
这个函数内部会创建一个Session准备好,相当于我提前准备一个服务员准备好
然后当监听器 _acceptor 被触发的时候,我们就调用回调函数(相当于一个房间),让之前准备好的服务员去服务这个客人

_acceptor.async_accept(new_session->Socket(),std::bind(&Server::handle_accept,this,new_session,placeholders::_1));

但是这里要提前绑定一个new_session这个参数,因为根据源码,回调函数的参数只能有一个,就是错误码

在这里插入图片描述
然后进入handle_accept函数,如果没有错误我们就调用这个创建的session去进行Start()
在Start中就会进行读写循环调用

三、客户端

客户端这么我们就不进行说明,因为今天做的是简单的异步echo模型,应答式的,并且客户端我们在第二节文章讲过了,用的客户端代码也是第二个文章的代码,所以就不进行说明

#include<boost/asio.hpp>
#include <iostream>
const int MAX_LENGTH = 1024;//表示发送和接收最大长度为1024字节
int main()
{while (1){try{//创建上下文服务boost::asio::io_context ios;//创建endpointboost::asio::ip::tcp::endpointremote_ep(boost::asio::ip::make_address("127.0.0.1"), 10086);//127.0.0.1是本机的回路地址 因为客户端和服务端在同一地址//服务器就是本机boost::asio::ip::tcp::socket sock(ios, remote_ep.protocol());boost::system::error_code error = boost::asio::error::host_not_found;sock.connect(remote_ep, error);if (error){std::cout << "connect failed,code is:" << error.value() <<"error message is" << error.message() << std::endl;return 0;}std::cout << "请输入需要发送的信息:";char request[MAX_LENGTH];std::cin.getline(request, MAX_LENGTH);size_t request_length = strlen(request);//获取实际要发送的数据长度//发送数据boost::asio::write(sock, boost::asio::buffer(request, request_length));char reply[MAX_LENGTH];//存储接收数据//用read读size_t reply_length = 0;boost::system::error_code ec;reply_length = sock.read_some(boost::asio::buffer(reply, MAX_LENGTH), ec);if (ec){std::cerr << "Read failed: " << ec.message() << std::endl;return 0;}std::cout << "回复:";std::cout.write(reply, reply_length);std::cout << "\n";}catch (std::exception& e){std::cerr << "Exception is: " << e.what() << std::endl;}}return 0;
}

四、运行截图与流程图

在这里插入图片描述
服务端接收完直接原文回给客户端就行
这里服务端报错 read error是因为客户端每发送一次就会断开连接,这是我们之前代码设定的

在这里插入图片描述

相关文章:

C++ asio网络编程(5)简单异步echo服务器

上一篇文章:C asio网络编程(4)异步读写操作及注意事项 文章目录 前言一、Session类1.代码2.代码详解3.实现Session类1.构造函数2.handle_read3.介绍一下boost的封装函数和api4.handle_write 二、Server类1.代码2.代码思路详解 三、客户端四、运行截图与流程图 前言 提示&…...

VBA会被Python代替吗

VBA不会完全被Python取代、但Python在自动化、数据分析与跨平台开发等方面的优势使其越来越受欢迎、两者将长期并存且各具优势。 Python以其易于学习的语法、强大的开源生态系统和跨平台支持&#xff0c;逐渐成为自动化和数据分析领域的主流工具。然而&#xff0c;VBA依旧在Exc…...

在Web应用中集成Google AI NLP服务的完整指南:从Dialogflow配置到高并发优化

在当今数字化客服领域,自然语言处理(NLP)技术已成为提升用户体验的关键。Google AI提供了一系列强大的NLP服务,特别是Dialogflow,能够帮助开发者构建智能对话系统。本文将详细介绍如何在Web应用中集成这些服务,解决从模型训练到高并发处理的全套技术挑战。 一、Dialogflow…...

Linux服务器连接SSH工具FinalShell安装使用支持Linux文件上传下载

前言 记录连接Linux服务器SSH工具FinalShell&#xff0c;支持可视化上传下载及查看服务器负载状态 安装使用 安装地址 官网下载:https://finalshell-ssh.com/ 通过网盘分享的文件&#xff1a;shell 链接: https://pan.baidu.com/s/1ZFcD_Js-r_lE3IV8wuuA5A?pwde72f 提取码:…...

【Java ee初阶】IP协议

网络层 IP 协议 1) 地址管理 针对网络上的各种设备&#xff0c;所在的位置&#xff0c;进行描述和区分 > IP 地址 2) 路由选择 网络结构非常复杂 挑选出合适的路径 IP 协议的报文结构 ipv4 ipv6 其他版本没有大规模推广使用~~ IP 协议中&#xff0c;报头也是变长的&a…...

WSL-Ubuntu 中安装 Git LFS 记录

#记录工作 一、问题背景 在 Windows Subsystem for Linux&#xff08;WSL&#xff09;的 Ubuntu 环境下进行开发时&#xff0c;当我们需要管理 Git 仓库中的大文件&#xff0c;使用 Git LFS&#xff08;Large File Storage&#xff09;是一个很好的解决方案。但在执行git lfs…...

Ubuntu源码版comfyui的安装

Comfyui也出桌面版了&#xff0c;但是想让大家多个人都使用怎么办呢&#xff1f;也有方法&#xff0c;安装Linux版&#xff0c;启动后会生成个网页地址&#xff0c;打开就能用了。 1、先来看下本地安装环境配置&#xff1a; 系统&#xff1a;Ubuntu 22.04 内存&#xff1a;2…...

Clang实现C++文件分析,含Python实战

最近的项目&#xff0c;需要获取到C代码中的Git修改过的函数信息&#xff0c;决定通过抽象语法树AST的方式&#xff0c;分析出文件内容后&#xff0c;通过匹配git diff修改的行号信息得知是什么函数。了解到Clang 能够进行C、C代码的分析&#xff0c;记录一下。 一、Clang AST…...

MFC listctrl修改背景颜色

在 MFC 中修改 ListCtrl 控件的行背景颜色&#xff0c;需要通过自绘&#xff08;Owner-Draw&#xff09;机制实现。以下是详细的实现方法&#xff1a; 方法一&#xff1a;通过自绘&#xff08;Owner-Draw&#xff09;实现 步骤 1&#xff1a;启用自绘属性 在对话框设计器中选…...

[Git]ssh模式每次提交都要输入密码

问题描述 连接用的ssh&#xff0c;不是https。每次git提交都要输入密码&#xff0c;很麻烦。 原因分析 ssh模式需要在git服务端保存密钥&#xff0c;不然每次都会校验用户的身份。 解决方案 1.生成密钥 进到用户路径下 C:\Users\szx\, 打开bash 生成密钥&#xff1a; s…...

请解释 React Native 的新架构(Fabric 和 TurboModules)与旧架构的主要区别

React Native 的新架构&#xff08;Fabric 和 TurboModules&#xff09;是对旧架构的重大革新&#xff0c;主要解决了旧架构在性能、线程模型和原生互操作性等方面的瓶颈。以下是新旧架构的核心区别&#xff1a; 1. 线程模型与异步通信 旧架构&#xff1a; 三层线程模型&…...

大小端的判断方法

大小端&#xff08;Endianness&#xff09; 是计算机存储多字节数据&#xff08;如整数、浮点数&#xff09;时的两种不同方式&#xff0c;决定了字节在内存中的排列顺序。 1. 大端&#xff08;Big-Endian&#xff09; 高位字节存储在低地址&#xff0c;低位字节存储在高地址。…...

技术视界 | 青龙机器人训练地形详解(四):复杂地形精讲之斜坡

在前几篇文章中&#xff0c;我们依次讲解了如何创建一个地形、如何将地形添加到训练环境中&#xff0c;并在上一期深入分析了复杂地形之一——台阶地形的创建方式与训练意义。本文将继续聚焦复杂地形训练中另一类代表性地形——斜坡&#xff08;Slope&#xff09;与金字塔斜坡&…...

典籍知识问答重新生成和消息修改Bug修改

1.Bug&#xff1a; {messageId: "temp-user-1747051925999",…} messageId : "temp-user-1747051925999" newContent : "关于选中的内容&#xff1a;\"The ancient people lived long by following natural laws\"&#xff0c;我的问题是&…...

交易所开发-如何开发一个交易所

交易所开发全流程指南&#xff1a;从架构设计到合规落地 ——2025年数字资产交易平台的构建逻辑与技术实践 一、开发核心流程&#xff1a;五阶段方法论 1. 需求定位与合规先行 市场细分&#xff1a;明确交易所类型&#xff08;CEX、DEX或混合型&#xff09;&#xff0c;选择目…...

工具篇-如何在Github Copilot中使用MCP服务?

Model Context Protocol (MCP) 是由 Anthropic 公司于 2024 年 11 月推出的一种开放协议标准&#xff0c;目的在于标准化 LLM 与外部数据源、工具及服务之间的交互方式。 MCP 被广泛类比为 “AI 领域的 USB-C 接口 ”。 一、vscode的安装 下载vscode Visual Studio …...

MATLAB机器人系统工具箱中的loadrobot和importrobot

loadrobot和importrobot是 MATLAB 机器人系统工具箱中用于创建机器人模型的两个核心函数&#xff0c;它们的主要区别可以从以下几个方面来理解&#xff1a; 1. 模型来源 loadrobot 直接加载工具箱预定义的机器人模型&#xff08;如 UR5e、Panda、Kinova 等&#xff09;。这些模…...

django之视图

django vs drf 首先要区分django 和 django rest framework(drf)。 django是前后端不分离的&#xff0c;后端写模板&#xff08;template&#xff09;渲染成html之后返回给浏览器。 drf是适应前后端分离的架构&#xff0c;基于django做的封装&#xff0c;提供的rest API规范…...

深入探讨dubbo组件的实践

目录 1、dubbo概述 1.1、介绍 1.2、RPC 1.3、区别 1.4、优点 2、dubbo分层 2.1、层级分类 1. Service 服务层&#xff08;业务层&#xff09; 2. Config 配置层 3. Proxy 服务代理层 4. Registry 注册中心层 5. Cluster 集群容错层 6. Monitor 监控层 7. Protoco…...

2.1 微积分基本想法

总结性表达 微积分的核心思想在于用简单图形逼近复杂形状的面积。牛顿与莱布尼茨通过"以直代曲"的突破性思路&#xff0c;将曲线围成的面积分解为无限个矩形之和&#xff0c;形成两大核心工具&#xff1a; 极限思想&#xff1a;通过无限细分矩形底边&#xff08;Δ…...

学习threejs,使用Physijs物理引擎,加载各种几何体网格对象

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...

Excel分组计算求和的两种实现方案

文章目录 背景样例数据方案一、函数求和实现步骤 方案二、数据透视表实现步骤 背景 在Excel文档中&#xff0c;经常会进行数据的求和计算&#xff0c;可使用不同的方式实现&#xff0c;记录下来&#xff0c;方便备查。 样例数据 已有商品销量信息&#xff0c;包含销售日期、…...

nestjs[一文学懂如何在nestjs中对npm功能包封装]

问题描述 NPM&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;它允许开发者轻松地分享、安装和管理依赖包&#xff0c;促进了代码的复用性和项目协作。而npm插件库将是nodejs开发中不可缺失的重要组成因素。 在nestjs中&#xff0c;官方已经给…...

PHP 连接和使用 Kafka 的指南

首先说明&#xff0c;我的是系统版本是&#xff1a;Ubuntu 22.04.3&#xff0c;下面是详细步骤 ###### PHP 连接和使用 Kafka 的指南 ###### # 安装依赖 sudo apt-get install -y librdkafka-dev # 安装必要的依赖 # 对于 Ubuntu/Debian sudo apt-get update sudo apt-get in…...

# 07_Elastic Stack 从入门到实践(七)---1

07_Elastic Stack 从入门到实践(七)—1 一、Filebeat入门之读取 Nginx 日志文件 1、首先启动 Elasticsearch 集群 和 Nginx 服务,打开GoogleChrome 浏览器,点击 elasticsearch-head 插件,连接Elasticsearch 集群 服务器。 # 查看网卡名 $ ip addr# 修改网卡配置,改为…...

CSS-PureCss样式开发

CSS-PureCss样式开发 1-开发说明 1-引入Pure.css2-直接拷贝代码 2-参考网址 purecss中文网 3-代码模板 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"wid…...

学习笔记:Conda 环境共享

1. 环境共享的重要性 环境共享是协作项目中非常实用的功能&#xff0c;它能确保整个项目的协作人员都使用相同的软件包&#xff0c;并保证这些包的版本正确。这可以避免因环境配置不同而导致的“在我的机器上可以运行”之类的问题。 2. 导出当前环境配置 如果需要将当前的 C…...

蓝牙AVDTP协议概述

1.AVDTP 概念 AVDTP 即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL&#xff08;音视频分配传输协 议&#xff09;&#xff0c;主要负责 A/V stream 的协商、建立及传输程序&#xff0c;还指定了设备之前传输 A/V stream 的消息格式. AVDTP 的传输机制和消息格式是以 RTP 为基…...

Java面试终极篇:Sentinel+Seata+Kafka Streams高并发架构实战

面试官&#xff1a;张总&#xff08;严肃脸&#xff09; 程序员&#xff1a;小王&#xff08;紧张冒冷汗&#xff09; 第一轮&#xff1a;分布式基础 张总&#xff1a;说说Spring Cloud Alibaba的Sentinel和Nacos的区别&#xff1f; 小王&#xff1a;&#xff08;结巴&#…...

提权相关记录

Windows potato本地提权 常见potato提权&#xff1a;BadPotato、EfsPotato、SweetPotato、JuicyPotato0、PrintNotifyPotato、RottenPotato 提权前置条件&#xff1a;拥有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限其中一个。 可以通过命令whoami /priv或whoa…...

信息化、数字化、数智化之间的区别和联系

在如今这个信息技术飞速发展的时代&#xff0c;我们常常会听到“信息化”、“数字化”和“数智化”这三个术语。对于大多数人来说&#xff0c;这些词汇听起来既高深又晦涩&#xff0c;但其实它们和我们的生活、工作密切相关。如果你能理解它们的概念与区别&#xff0c;你不仅能…...

制造业IT管理方法论:柔性变更与数据治理的融合实践

1. 引言 随着工业4.0时代的深入发展&#xff0c;信息技术&#xff08;IT&#xff09;与运营技术&#xff08;OT&#xff09;的融合日益紧密&#xff0c;对制造企业的IT管理提出了前所未有的挑战与机遇。传统的IT管理框架&#xff0c;如ITIL&#xff08;信息技术基础架构库&…...

深入了解 gmx_RRCS:计算原理、操作步骤及输出文件解析

前段时间&#xff0c;我写了一篇介绍gmx_RRCS的推文&#xff0c;之后有不少人希望我能再出一个更详细的版本&#xff0c;尤其是对gmx_RRCS输出文件含义进行解读。大家的反馈我都看到了&#xff0c;所以准备再写一篇&#xff0c;仔细讲讲输出文件里各项内容是什么意思&#xff0…...

MySQL 8.0 OCP 1Z0-908 题目解析(1)

题目001 Choose two. User fwuserlocalhost is registered with the SQL Enterprise Firewall and has been granted privileges for the sakila database. Examine these commands that you executed and the results: mysql> SELECT MODE FROM INFORMATION_SCHEMA.SQL…...

【漫话机器学习系列】254.假设空间(Hypothesis Space)

假设空间&#xff08;Hypothesis Space&#xff09;详解&#xff1a;理解模型选择的核心概念 在机器学习、深度学习、统计建模等领域&#xff0c;我们常常会听到一个专业术语——假设空间&#xff08;Hypothesis Space&#xff09;。假设空间的理解&#xff0c;直接关系到模型…...

【Game】Powerful——Hero Trial(11)

文章目录 1、阵容推荐2、第一章 绝望之境3、第二章 万剑之殇4、第三章 自然之力5、第四章 1、阵容推荐 我一般都是&#xff0c;三物理&#xff0c;一封&#xff0c;一辅助&#xff0c;或者双物理一法系&#xff0c; 物理优先单攻的&#xff0c;比如天策、五庄、天魔&#xff0…...

Java MVC

在软件开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;是一种常用的设计模式&#xff0c;它将应用程序分为三个核心部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这…...

单片机Day10

对向流水 #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void main() { while(1) { P20x7e; delay_10us(50000); P20xbd; delay_10us(50000); P20xdb; delay_10us(50000); P20xe7; …...

大语言模型训练的两个阶段

先说结论&#xff1a;第一阶段在云平台训练至收敛 第二阶段本地GPU微调 一、阶段划分的核心逻辑 阶段目标资源特点典型耗时占比成本敏感度预训练获取通用表征能力需要大规模分布式计算70-90%高&#xff08;追求每美元算力&#xff09;微调适配特定任务需要领域数据安全/低延迟…...

ACL访问控制列表:access-list 10 permit 192.168.10.1

ACL访问控制列表 标准ACL语法 1. 创建ACL access-list <编号> <动作> <源IP> <通配符掩码> // 编号范围 1-99 // 动作&#xff1a;permit 允许 、 deny 拒绝2. 示例 //允许192.168.1.0/24g整个网络,0.0.0.255 反掩码 access-list 10 permit 192.1…...

高粘度、强腐蚀介质解决方案:V型气动带手动活塞式开关调节球阀的五大核心优势-耀圣控制

高粘度、强腐蚀介质解决方案&#xff1a;V型气动带手动活塞式开关调节球阀的五大核心优势 在石油化工、污水处理、锂电材料等工业场景中&#xff0c;含有颗粒的高粘度介质、料浆及强腐蚀性流体对阀门的性能提出了极高要求。传统球阀易因介质沉积、腐蚀或卡阻导致失效&#xff…...

后端开发面试高频50个问题,简单解答

以下是后端开发面试中常见的50个高频问题及其详细解答&#xff0c;涵盖了语言基础、数据库、网络、操作系统、设计模式等多个方面&#xff1a; 编程语言基础 Java 中的 final 关键字有什么作用&#xff1f; final 可以修饰类、方法和变量。修饰类时&#xff0c;类不能被继承&am…...

LayerNorm vs RMSNorm 技术对比

1. 核心概念 LayerNorm (层归一化) 思想&#xff1a;对单个样本的所有特征维度进行归一化目标&#xff1a;使每个样本的特征分布 μ 0 \mu0 μ0&#xff0c; σ 1 \sigma1 σ1特点&#xff1a;同时调整均值和方差 RMSNorm (均方根归一化) 思想&#xff1a;基于均方根的简…...

基于SpringBoot的校园周边美食探索及分享平台【附源码+数据库+文档下载】

一、项目简介 本项目是一个基于 SpringBoot Vue 的校园周边美食探索与分享平台&#xff0c;专为在校大学生开发&#xff0c;集美食推荐、好友互动、收藏分享于一体。 通过平台&#xff0c;用户可以探索学校周边的美食店铺、发布美食鉴赏、添加好友进行交流分享。同时&#x…...

开启WSL的镜像网络模式

开启WSL的镜像网络模式 前提 Windows主机系统版本高于Windows 11 22H2。WLS版本>2.0。 可输入wsl --version查看当前系统wsl版本。 修改设置 图形界面修改 在开始菜单中搜索&#xff1a;wsl settings&#xff0c;结果如下图所示&#xff1a; 点击“打开”&#xff0…...

传导发射中的模拟手

“模拟手”是按照国际 EMC 标准&#xff08;如 CISPR 16-1-2, CISPR 22, GB/T 9254 等&#xff09;中规定的&#xff0c;用于 测试带有接地金属外壳或信号线接口设备在接地或金属表面触摸时的传导发射性能。有些设备在“无触摸”时能通过传导发射&#xff0c;但一旦接地或接手&…...

Femap许可使用统计与分析

在电磁仿真领域&#xff0c;Femap作为一款高效且功能强大的工具&#xff0c;广泛应用于各种复杂场景。随着企业规模的扩大和团队协作的加强&#xff0c;如何有效地管理和利用Femap许可证资源成为了关注的焦点。本文将向您介绍Femap许可使用统计与分析的重要性&#xff0c;以及如…...

接口自动化测试设计思路--设计实战

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 接口自动化测试设计思路 如何进行接口自动化测试设计思路&#xff1f;1. 背景2. 设计目标3. 框…...

华为FAT AP配置 真机

FAT AP 的主要特点 特性说明独立工作不需要AC&#xff08;无线控制器&#xff09;&#xff0c;自己处理认证、加密、漫游等功能。内置完整功能支持SSID、安全策略&#xff08;WPA/WPA2&#xff09;、VLAN、QoS、DHCP等。适合小型网络适用于家庭、小企业、分支机构等少量AP的场…...

Node.js中那些常用的进程通信方式

文章目录 1 什么是子进程?2 核心方法详解2.1 `child_process.spawn(command, [args], [options])`2.2 `child_process.exec(command, [options], callback)`2.3 `child_process.execFile(file, [args], [options], callback)`2.4 `child_process.fork(modulePath, [args], [op…...