【负载均衡在线OJ项目日记】引入网络库和客户端用户路由功能
目录
引入cpp-httplib库
将编译与运行服务打包
代码
客户端用户路由功能
采用MVC结构进行设计
用户路由功能
路由功能代码
引入cpp-httplib库
对于后端编译与运行模块基本已经设计完成,最后用户是通过网络传递代码等信息;我们就要将这个模块引入网络服务,对于套接字的编写过程非常麻烦我们可以使用现成HTTP协议库。
cpp-httplib 是一个轻量级的、高效的C++ HTTP/HTTPS 客户端和服务器库。它由 Hideaki Sone(yhirose)开发,并在 MIT 许可下发布。该项目的主要目标是提供一种简单易用的方式,在 C++ 应用程序中实现 HTTP 和 HTTPS 功能。
任何版本都可以从网上下载得到,这个库是一个单头文件库,可以直接将这个库头文件下载转移到我们的项目公共模块中,使用时添加库头文件和打开命名空间即可。对于使用这个现成的HTTP库时我们的gcc编译器一定要高版本的至少要7版本以上,否则使用低版本的编译器时对于这个库可以会在编译或者运行时报错;因此我们需要对gcc编译器进行升级。这里大家从网上自行搜索升级,这里不过多哔哔。
将编译与运行服务打包
通过HTTP协议服务端收到请求,请求中的请求参数包含代码、输入、时间和空间限制信息,直接提取请求中的响应数据交给编译和运行模块即可;处理完代码后,将运行信息作为响应正文交给客户端即可。
代码
#include "compile_run.hpp"
#include <jsoncpp/json/json.h>
#include "../comm/httplib.h"
using namespace ns_compiler_and_run;
using namespace httplib;
// 编译服务随时可能被多个人请求,必须保证传递上来的代码,形成源文件名称的时候要具有唯一性,要不然多个用户之间会影响//
void Usage(std::string proc)
{std::cerr << "Usage : " << "\n\t" << proc << std::endl;
}
int main(int argc, char *argv[2])
{if (argc != 2){Usage(argv[0]);return 1;}// 对外提供一个服务Server svr;svr.Post("/compile_and_run", [](const Request &req, Response &resp){//用户请求的正文就是我们想要的 json stringstd::string in_json = req.body;std::string out_json;if(!in_json.empty()){//不为空调用编译和运行服务CompilerAndRun::Start(in_json,&out_json);resp.set_content(out_json,"application/json;charset=utf-8");} });svr.listen("0.0.0.0", atoi(argv[1])); // //httpreturn 0;
}
客户端用户路由功能
编译与运行后端功能模块编写完成后,就要对前端模块进行设计;对于前端的设计简单来说就是建立一个小型网站,用户进入网站就是获取题目列表、编辑代码、提交判题,这三个主要的模块。
采用MVC结构进行设计
M: Model,通常是和数据交互的模块,比如,对题库进行增删改查(文件版,MySQL)
V: view, 通常是拿到数据之后,要进行构建网页,渲染网页内容,展示给用户的(浏览器)
C: control, 控制器,就是我们的核心业务逻辑
用户路由功能
根据用户的需求提供不同的服务,但是也就是只有三个功能:
- 获取题目列表
- 用户要根据题目编号,获取题目内容
- 提交代码,使用我们的判题功能(1,每道题的测试用例,2.compile_and_run功能)
路由功能代码
#include<iostream>
#include"../comm/httplib.h"
using namespace httplib;
int main()
{//用户请求的路由功能//根据用户的需求提供不同的服务//获取题目列表//用户要根据题目编号,获取题目内容//提交代码,使用我们的判题功能(1,每道题的测试用例,2.compile_and_run功能)Server svr;svr.Get("/all_question",[](const Request &req,Response &resp){resp.set_content("这是所有的题目列表","text/plain;charset=utf-8");});//svr.Get(R"("/questions/(\d+))",[](const Request &req,Response &resp){//题目编号std::string number = req.matches[1];resp.set_content("这是指定的一道题: "+number , "text/plain;charset=utf-8");});//正则表达式//保证保持原始字符串svr.Get(R"(/judge/(\d+))",[](const Request &req,Response &resp){std::string number = req.matches[1];resp.set_content("指定题目的判题: "+number,"text/plain;charset=utf-8");});svr.listen("0.0.0.0",8080);return 0;
}
-
正则表达式(regex): 正则表达式是一种用于匹配字符串中字符组合的模式。它们提供了一种灵活的方式来搜索、匹配和操作文本。在这个代码中,正则表达式被用于匹配请求的URL路径中特定的模式。
-
R前缀: 在C++中,R前缀用于创建原始字符串字面量。原始字符串字面量将反斜杠(\)视为字面字符而不是转义字符。这在处理正则表达式或任何其他字符串时非常有用,你不想解释转义序列时可以使用它。
解释:
- 在第二和第三个路由定义中,正则表达式被用在原始字符串字面量(前缀为
R
)中,用于定义动态路由,匹配包含数字模式的URL。 - 在第二个路由(
/questions/(\d+)
)中,模式是寻找包含/questions/
后跟一个或多个数字的URL。括号(\d+)
捕获数字作为一个组,以备后用。 - 在第三个路由(
/judge/(\d+)
)中,模式类似,但匹配包含/judge/
后跟一个或多个数字的URL。 - 在与每个路由关联的lambda函数内部,从URL中捕获的数字使用
req.matches[1]
进行检索,其中req.matches
保存了正则表达式捕获的匹配组。然后使用这些数字来提供特定路由的响应。
今天对项目网络库引入和用户路由功能的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!!
相关文章:
【负载均衡在线OJ项目日记】引入网络库和客户端用户路由功能
目录 引入cpp-httplib库 将编译与运行服务打包 代码 客户端用户路由功能 采用MVC结构进行设计 用户路由功能 路由功能代码 引入cpp-httplib库 对于后端编译与运行模块基本已经设计完成,最后用户是通过网络传递代码等信息;我们就要将这个模块引入…...

【Vue3】env环境变量的配置和使用(区分cli和vite)
原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、env文件二、vue3cli加载env1..env配置2..dev配置(其他环境参考)3.package.json文件4.使用 三、vue3vite加载e…...

ACW石子合并-XMUOJ元素共鸣:唤醒神之眼 -区间DP
题目 思路 话不多说,直接上代码 代码 /* ACW石子合并-XMUOJ元素共鸣:唤醒神之眼 JinlongW-2024/05/25 区间DP 当i<j时,f[i][j]min(f[i][k]f[k][j]s[j]-s[i-1]) 当ij时,f[i][j]0 最终答案:f[1][n] *//* 区间DP…...

大语言模型实战——搭建纯本地迷你版RAG
1. 概念 RAG(Retrieval Augmented Generation)检索增强生成,它结合了搜索技术和大语言模型的提示词功能,以搜索算法找到的信息作为背景上下文,来辅助大语言模型(Large Language Model, LLM)生成…...
内存分配算法
一、实验目的: 实验目的: 通过编写一个内存分配模拟程序,实现首次适应算法(First Fit)、循环首次适应算法(Next Fit)、最佳适应算法(Best Fit)和最差适应算法(…...

Hive运行错误
Hive 文章目录 Hive错误日志错误SessionHiveMetaStoreClientql.Driver: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTaskerror: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Please check …...

vue3之使用图片实现类似于 el-radio 的单选框功能,并且可实现选中和取消选中
背景 我们在工作中常用的一般都是使用类似于 element-plus 中的 el-radio 或者是 el-checkbox 来实现单选或者多选 若有一天我们遇到了一个新的业务需求,需要使用 图片 来实现类似于 el-radio 的功能,并且要求实现第一次点击时处于选中状态,当我们再次点击时处于非选中状态…...

Vue 安装vue
1、官网安装下载安装nodejs 2、安装完成后,通过命令查看版本,可以查看到版本 node -v npm -v 3、安装Vue CLi npm install -g vue/cli 4、创建项目,vue create test 如果遇到报错: ERROR Error: spawn yarn ENOENT Error: spawn yarn ENOENT at ChildP…...

5月30日在线研讨会 | 面向智能网联汽车的产教融合解决方案
随着智能网联汽车技术的快速发展,产业对高素质技术技能人才的需求日益增长。为了促进智能网联汽车行业的健康发展,推动教育链、人才链与产业链、创新链的深度融合,经纬恒润推出产教融合相关方案,旨在通过促进教育链与产业链的深度…...

嵩山为什么称为三水之源
三水指黄河、淮河、济河,这三条河流环绕在嵩山周边。 黄河横亘在嵩山北部,其支流伊洛河从西南方环绕嵩山,然后汇入黄河。济河,古称济水,源自济源王屋山,自身河道在东晋时代被黄河夺占,从此消失。…...

最新文章合集
GitHub宝藏项目:每天一个,让你的技术库增值不停! STORM、SuperMemory、Awesome Chinese LLM、AI写作助手、资料搜集、文章生成、视角问题引导、模拟对话策略、内容导入、浏览器插件、资源库、开源微调模型 开发者必看:Linux终端…...

Jmeter预习第1天
Jmeter参数化(重点) 本质:使用参数的方式来替代脚本中的固定为测试数据 实现方式: 定义变量(最基础) 文件定义的方式(所有测试数据都是固定的情况下[死数据],eg:注册登录࿰…...

Volatile的内存语义
1、volatile的特性 可见性:对一个volatile变量的读,总能够看到任意一个线程对这个volatile变量的写入。 原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile这种复合操作不具有原子性。 接下来我们用程序验证。…...

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 解决方案
随着越来越多用户使用 DolphinDB,各式各样的应用场景对 DolphinDB 的数据接入提出了不同的要求。部分用户需要将 Oracle 11g 的数据实时同步到 DolphinDB 中来,以满足在 DolphinDB 中实时使用数据的需求。本篇教程将介绍使用 Debezium 来实时捕获和发布 …...
前端如何在 WebSocket 的请求头中使用标准 HTTP 头携带 Authorization 信息,添加请求头
WebSocket 的请求头(header)中如何携带 authorization...
Java---图书管理系统(练习版)
1.主函数 import book.Book; import book.BookList; import user.AdminUser; import user.NormalUser; import user.User;import java.util.Scanner;public class Main {public static User Login(){//确认你的身份System.out.println("请输如你的名字");Scanner sc…...

ICML2024 定义新隐私保护升级:DP-BITFIT新型微调技术让AI模型学习更安全
DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! 引言:差分隐私在大模型微调中的重要性和挑战 在当今的深度学习领域,大型预训练模型的微调已成为提高各种任务性能的关键技术。然而&am…...

网络空间安全数学基础·整除与同余
主要内容: 整除的基本概念(掌握) 素数(掌握) 同余的概念(掌握) 1.1整除 定义:设a,b是任意两个整数,其中b≠0,如果存在一个整数q,使 …...

同旺科技 FLUKE ADPT 隔离版发布 ---- 说明书
所需设备: 1、FLUKE ADPT 隔离版 内附链接; 应用于:福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于:福禄克Fluke 15B / 17B / 18B...
云计算-角色、特性和模型 (Roles, Characteristics, and Models)
角色、特性和模型 (Roles, Characteristics, and Models) 角色和边界 (Roles and Boundaries) 为了识别云计算模型,我们首先需要了解各种参与者的角色和边界。由于云系统通常遵循面向服务的模型,我们需要了解服务提供者和服务订阅者之间的边界。我们将遵…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...