【负载均衡在线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;
}
  1. 正则表达式(regex): 正则表达式是一种用于匹配字符串中字符组合的模式。它们提供了一种灵活的方式来搜索、匹配和操作文本。在这个代码中,正则表达式被用于匹配请求的URL路径中特定的模式。

  2. R前缀: 在C++中,R前缀用于创建原始字符串字面量。原始字符串字面量将反斜杠(\)视为字面字符而不是转义字符。这在处理正则表达式或任何其他字符串时非常有用,你不想解释转义序列时可以使用它。

解释:

  • 在第二和第三个路由定义中,正则表达式被用在原始字符串字面量(前缀为R)中,用于定义动态路由,匹配包含数字模式的URL。
  • 在第二个路由(/questions/(\d+))中,模式是寻找包含/questions/后跟一个或多个数字的URL。括号(\d+)捕获数字作为一个组,以备后用。
  • 在第三个路由(/judge/(\d+))中,模式类似,但匹配包含/judge/后跟一个或多个数字的URL。
  • 在与每个路由关联的lambda函数内部,从URL中捕获的数字使用req.matches[1]进行检索,其中req.matches保存了正则表达式捕获的匹配组。然后使用这些数字来提供特定路由的响应。

今天对项目网络库引入和用户路由功能的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!! 

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

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

相关文章

跟TED演讲学英文:Bring on the learning revolution! by Sir Ken Robinson

Bring on the learning revolution! Link: https://www.ted.com/talks/sir_ken_robinson_bring_on_the_learning_revolution Speaker: Sir Ken Robinson Date: February 2010 文章目录 Bring on the learning revolution!IntroductionVocabularySummaryTranscriptAfterword I…

基于 BERT 对 IMDB 电影评论进行情感分类

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

# AI产品经理的自我修养:既懂用户,更懂技术!

今天上班的时候&#xff0c;发现很多AI社群都在讨论一篇播客《一个顶级AI产品经理的自我修养&#xff0c;对谈光年之外产品负责人Hidecloud》&#xff0c;这篇播客的嘉宾是光年之外的产品负责人——Hidecloud&#xff08;张涛&#xff09;&#xff0c;聊了许多关于他在做AI产品…

MySQL多表关联查询习题

一、素材 -- Active: 1714203732007127.0.0.13306db_stu -- 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); -- 创建…

Springboot中的微服务架构实践

Spring Boot中的微服务架构实践 在本文中&#xff0c;我们将分析微服务架构的关键概念及其在Spring Boot中的应用。然后&#xff0c;我们将演示如何构建微服务并将它们部署到云端或本地服务器。最后&#xff0c;我们将探索使用Spring Cloud和Netflix Eureka进行服务发现和配置…

Android遇到未处理的异常时干掉自己然后重新启动

Android遇到未处理的异常时干掉自己然后重新启动 安卓主线程遇到异常会死掉表现为直接闪退&#xff0c;如果只是添加了全局异常处理&#xff0c;主线程异常会表现为卡死此时则需要对活动进行重启处理* override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(sa…

【机器学习】机器学习基础概念与初步探索

❀机器学习 &#x1f4d2;1. 引言&#x1f4d2;2. 机器学习概述&#x1f4d2;3. 机器学习基础概念&#x1f389;2.1 机器学习的分类&#x1f389;2.2 数据预处理&#x1f308;数据清洗与整合&#x1f308; 特征选择和特征工程&#x1f308;数据标准化与归一化 &#x1f4d2;4. …

c#从数据库读取数据到datagridview

从已有的数据库读取数据显示到winform的datagridview控件&#xff0c;具体代码如下&#xff1a; //判断有无表 if (sqliteConn.State ConnectionState.Closed) sqliteConn.Open(); SQLiteCommand mDbCmd sqliteConn.CreateCommand(); m…

精通Burpsuite:SQL注入测试的实验操作步骤详解

引言 在网络安全领域&#xff0c;SQL注入是一种常见的攻击手段&#xff0c;它允许攻击者通过注入恶意SQL代码来操纵后端数据库。Burpsuite作为一款领先的Web安全测试工具&#xff0c;提供了一系列的功能来帮助安全专家发现和防御这类漏洞。本文将详细介绍如何使用Burpsuite进行…

探数API统计分享-2017年-2021年中国各省人均消费支出统计

根据2017年至2021年的统计数据&#xff0c;我国各省&#xff08;市、区&#xff09;的人均消费支出情况各不相同。其中&#xff0c;上海的人均消费支出最高&#xff0c;达到了2021年的48879元&#xff0c;位居全国之首。紧随其后的是北京&#xff0c;人均消费支出为43640元。 …

类和对象(下篇)(未完结)!

文章目录 在谈构造函数1.构造函数体赋值2.初始化列表尽量使用初始化列表&#xff1f;初始化列表的初始化顺序&#xff1f;成员变量声明处的缺省值构造函数支持类型转换3.explicit关键字 static成员 在谈构造函数 1.构造函数体赋值 class Date{public:Date(int year, int mont…

其它高阶数据结构⑦_Skiplist跳表_概念+实现+对比

目录 1. Skiplist跳表的概念 2. Skiplist跳表的效率 3. Skiplist跳表的实现 3.1 力扣1206. 设计跳表 3.2 Skiplist的初始化和查找 3.3 Skiplist的增加和删除 3.4 Skiplist的源码和OJ测试 4. 跳表和平衡搜索树/哈希表的对比 本篇完。 1. Skiplist跳表的概念 skiplist是…

麻省理工出品!这个自动化神器让你的电脑自己工作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Github中fork的仓库和自己创建的仓库有什么区别?

在GitHub中&#xff0c;fork的仓库和自己创建的仓库有几个主要区别&#xff1a; 来源不同&#xff1a; 创建的仓库&#xff1a;这是你自己从零开始创建的仓库&#xff0c;完全由你自主掌控&#xff0c;初始内容为空或者根据你选择的模板生成。Fork的仓库&#xff1a;这是从别人…

软件即服务-SaaS

目录 1. SaaS成熟度模型 2. SaaS应用平台 3. SaaS应用实现层次 4. 多租户技术 5. 可配置性 5.1 业务构件 5.2 数据可配置 5.2.1 定制字段 5.2.2 预分配字段 5.2.3 名称值对 5.3 功能可配置 5.3.1 业务构件设计 5.3.2 功能包设计 5.3.3 销售包设计…

16.线性回归代码实现

线性回归的实操与理解 介绍 线性回归是一种广泛应用的统计方法&#xff0c;用于建模一个或多个自变量&#xff08;特征&#xff09;与因变量&#xff08;目标&#xff09;之间的线性关系。在机器学习和数据科学中&#xff0c;线性回归是许多入门者的第一个模型&#xff0c;它…

A股重磅!史上最严减持新规,发布!

此次减持新规被市场视为A股史上最严、最全面的规则&#xff0c;“花式”减持通道被全面“封堵”。 5月24日晚间&#xff0c;证监会正式发布《上市公司股东减持股份管理暂行办法》&#xff08;以下简称《减持管理办法》&#xff09;及相关配套规则。 据了解&#xff0c;《减持…

第24集《摄大乘论》

请大家打开《讲义》第七十八页。 癸二、成差别转 我们这一科讲到依他起相&#xff0c;依他起相开出来有十一个识&#xff0c;这十一个识当中&#xff0c;前面所说的十八界&#xff0c;是构成整个生命的一个自体。就是不管你是因地的造业、果报的受用&#xff0c;都是要有根、…

探索电子邮件的神奇世界

目录 介绍 电子邮件系统的工作原理 邮件发送过程 邮件接收过程 简单邮件传输协议&#xff08;SMTP&#xff09; 简介 工作原理 SMTP 请求 SMTP 响应 SMTP 通信流程 SMTP 命令 SMTP 服务器 SMTP 的优点 SMTP 的缺点 电子邮件信件结构 信头 信体 MIME编码和发送…

Docker (一)

目录 一、Docker 简介 Docker 的核心概念 1. 容器(Container) 2. 镜像(Image) 3. 仓库(Repository)和注册表(Registry) 4. Dockerfile 5.Docker客户端 6.Docker主机 二、Docker 的优势和特点 1. 轻量级和快速