【负载均衡在线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) 为了识别云计算模型,我们首先需要了解各种参与者的角色和边界。由于云系统通常遵循面向服务的模型,我们需要了解服务提供者和服务订阅者之间的边界。我们将遵…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
