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

Rust配置开发环境+服务器实战

https://www.cnblogs.com/skzxc/p/12129353.html

  1. 默认已经安装好MSVC。

  2. 官网https://www.rust-lang.org/zh-CN/learn/get-started安装Rust安装器,选择winodwsx64版本

  3. 运行安装,将文件夹移动到D盘,安装后,文件夹在C:\Users\xxx下有.cargo.rustup两个文件夹

  4. 新建环境变量

    CARGO_HOME
    D:\Users\xxx\.cargoRUSTUP_HOME
    D:\Users\xxx\.rustuppath
    %CARGO_HOME%\bin
    
  5. 测试安装成功,输入命令

    cargo --version
    rustup --version
    
  6. 环境变量配置加速安装地址

    RUSTUP_DIST_SERVER
    https://mirrors.tuna.tsinghua.edu.cn/rustup
    RUSTUP_UPDATE_ROOT
    https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup
    
  7. 配置库镜像,在C:\Users\xxx\.cargo下创建config.toml文件,无后缀,复制粘贴

    [source.crates-io]
    registry = "https://github.com/rust-lang/crates.io-index"
    replace-with = "tuna"
    [source.tuna]
    registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
    
  8. 运行安装程序。

  9. 安装VSCode插件

    • Rust Analyzer
    • Even Better TOML
    • CodeLLDB

开发示例

下面包含给出一个Rust服务器的开发示例

给出需求:

  1. 接收两个可选参数:
    1. html_path:默认为index.html,带有路径检查
    2. port:默认为8787
  2. 保存变量html_path,每次浏览器端刷新时,都实时读取html_path返回给服务器渲染。这是为了方便开发和调试。
  3. 开放静态资源给前端。
  4. 允许前端通过/write?filepath=xxx,以及body的数据,写入到服务器端。

开发步骤:

  1. 新建一个项目,命令行输入cargo new myproject

  2. 测试环境配置,编译cargo build

  3. 测试环境配置,运行cargo run

  4. cargo.toml中,复制粘贴

    [package]
    name = "mini_server"
    version = "0.1.0"
    edition = "2024"[dependencies]
    hyper = { version = "0.14", features = ['full']}
    tokio = { version = "1", features = ["full"] }
    url = '2.3'
    mime_guess = "2.0"
    
  5. src/main.rs中,复制粘贴

    use hyper::service::{make_service_fn, service_fn};
    use hyper::{Body, Method, Request, Response, Server, StatusCode};
    use std::fs;
    use std::net::SocketAddr;
    use std::path::Path;
    use std::sync::Arc;
    use tokio::signal;
    use hyper::body::to_bytes;
    use url::form_urlencoded;
    use mime_guess::from_path;#[tokio::main]
    async fn main() {// 从命令行参数获取HTML文件路径和端口号let args: Vec<String> = std::env::args().collect();let html_file_path = args.get(1).map(|s| s.as_str()).unwrap_or("index.html");let port = args.get(2).and_then(|s| s.parse::<u16>().ok()).unwrap_or(8787);// 检查文件是否存在if !Path::new(html_file_path).exists() {eprintln!("File not found: {}", html_file_path);return;}// 将HTML文件路径存储在Arc中以便在多个请求之间共享let html_file_path = Arc::new(html_file_path.to_string());// 定义服务处理函数let make_svc = make_service_fn(move |_conn| {let html_file_path = Arc::clone(&html_file_path);async move {Ok::<_, hyper::Error>(service_fn(move |req| {let html_file_path = Arc::clone(&html_file_path);async move {handle_request(req, html_file_path).await}}))}});// 定义服务器地址let addr = SocketAddr::from(([127, 0, 0, 1], port));// 启动服务器let server = Server::bind(&addr).serve(make_svc);// 处理服务器关闭信号let graceful = server.with_graceful_shutdown(shutdown_signal());println!("Server running at http://{}", addr);// 运行服务器if let Err(e) = graceful.await {eprintln!("Server error: {}", e);}
    }// 处理HTTP请求
    async fn handle_request(req: Request<Body>,html_file_path: Arc<String>,
    ) -> Result<Response<Body>, hyper::Error> {match (req.method(), req.uri().path()) {// 返回HTML内容(&Method::GET, "/") => {match read_file_to_string(&html_file_path) {Ok(content) => Ok(Response::new(Body::from(content))),Err(e) => {let response = Response::builder().status(StatusCode::INTERNAL_SERVER_ERROR).body(Body::from(format!("Failed to read HTML file: {}", e))).unwrap(); // This unwrap is safe because we know the builder is correctly configuredOk(response)}}}// 处理文件写入请求(&Method::POST, "/write") => {// 解析查询参数let query = req.uri().query().unwrap_or_default();let params: Vec<(String, String)> = form_urlencoded::parse(query.as_bytes()).into_owned().collect();// 获取文件路径参数let file_path = params.iter().find(|(key, _)| key == "filepath").map(|(_, value)| value.to_string()).unwrap_or_else(|| "example.txt".to_string());// 读取请求体内容let body_bytes = to_bytes(req.into_body()).await?;let body_content = String::from_utf8(body_bytes.to_vec()).unwrap_or_default();// 写入文件match write_string_to_file(&file_path, &body_content) {Ok(_) => Ok(Response::new(Body::from("File written successfully"))),Err(e) => {let response = Response::builder().status(StatusCode::INTERNAL_SERVER_ERROR).body(Body::from(format!("Failed to write file: {}", e))).unwrap(); // This unwrap is safe because we know the builder is correctly configuredOk(response)}}}(&Method::GET, path) => {// 构建文件路径let file_path = format!(".{}", path);match read_file_to_bytes(&file_path) {Ok(content) => {// 根据文件扩展名猜测MIME类型let mime_type = from_path(&file_path).first_or_octet_stream();let response = Response::builder().header("Content-Type", mime_type.as_ref()).body(Body::from(content)).unwrap(); // This unwrap is safe because we know the builder is correctly configuredOk(response)}Err(_) => {// 文件不存在,返回404 Not Foundlet response = Response::builder().status(StatusCode::NOT_FOUND).body(Body::from("Not Found")).unwrap(); // This unwrap is safe because we know the builder is correctly configuredOk(response)}}}// 返回404 Not Found_ => {let response = Response::builder().status(StatusCode::NOT_FOUND).body(Body::from("Not Found")).unwrap(); // This unwrap is safe because we know the builder is correctly configuredOk(response)}}
    }// 处理服务器关闭信号
    async fn shutdown_signal() {// 等待Ctrl+C信号signal::ctrl_c().await.expect("Failed to install CTRL+C signal handler");println!("Shutting down server...");
    }// 读取文件内容为字符串
    fn read_file_to_string(file_path: &str) -> Result<String, std::io::Error> {fs::read_to_string(file_path)
    }// 将字符串写入文件
    fn write_string_to_file(file_path: &str, content: &str) -> Result<(), std::io::Error> {fs::write(file_path, content)
    }// 读取文件内容为字节数组
    fn read_file_to_bytes(file_path: &str) -> Result<Vec<u8>, std::io::Error> {fs::read(file_path)
    }
    
  6. cargo build。让大模型生成一个index.html文件,与生成的exe放进文件夹,点击运行即可。

相关文章:

Rust配置开发环境+服务器实战

https://www.cnblogs.com/skzxc/p/12129353.html 默认已经安装好MSVC。 官网https://www.rust-lang.org/zh-CN/learn/get-started安装Rust安装器&#xff0c;选择winodwsx64版本 运行安装&#xff0c;将文件夹移动到D盘&#xff0c;安装后&#xff0c;文件夹在C:\Users\xxx下…...

使用DeepSeek+KIMI生成高质量PPT

一、使用DeepSeek DeepSeek官网&#xff1a;DeepSeek 点击“开始对话”&#xff0c;进入交互页面。 在上图中&#xff0c;输入问题&#xff0c;即可获取AI生成的结果。 基础模型&#xff08;V3&#xff09;&#xff1a;通用模型&#xff08;2024.12&#xff09;&#xff0c;高…...

虚拟机如何设置ip

在虚拟机中设置IP地址的具体步骤会因虚拟机软件&#xff08;如VMware、VirtualBox等&#xff09;和操作系统&#xff08;如Windows、Linux等&#xff09;的不同而有所差异。以下是几种常见虚拟机软件和操作系统的IP设置方法。 --- 一、VMware中的IP设置 1.Windows虚拟机 1. 打…...

蓝桥杯 路径之谜

路径之谜 题目描述 小明冒充 XX 星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 nnnn 个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&#xff0c;但不能斜着走…...

Git操作指南:分支合并、回退及其他重要操作

在软件开发的协作过程中&#xff0c;Git 作为一款强大的版本控制系统&#xff0c;能帮助开发者高效管理代码的各个版本和分支。本文将详细介绍 Git 中常见的分支合并、取消本地修改、回退操作等&#xff0c;并提供通俗易懂的解释和步骤指南。 一、分支合并 分支合并是 Git 工…...

Element Plus中el-tree点击的节点字体变色加粗

el-tree标签设置 <el-tree class"tree":data"treeData":default-expand-all"true":highlight-current"true"node-click"onTreeNodeClick"><!-- 自定义节点内容&#xff0c;点击的节点字体变色加粗 --><!-- 动…...

jenkens使用笔记

jenkens使用笔记 笔记使用版本是2.492.1 git仓库ssh证书配置 已开始配置一直不行&#xff0c;然后下载插件&#xff0c;多次重启等一些列操作&#xff0c; 后来配置就可以工作了&#xff0c;原因不祥&#xff0c;不知道哪个配置起效了。 等回来闹明白了&#xff0c;再补充笔记…...

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析

腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;对比分析 腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;作为当前文生图领域的两大代表模型&#xff0c;各自…...

深入浅出理解编译器:前端视角

一、编译器究竟是什么&#xff1f; 在前端开发的世界里&#xff0c;我们经常会听到 “编译器” 这个词。就拿 Babel 来说&#xff0c;在它的官网上&#xff0c;最显眼的一句话就是&#xff1a;“Babel is a JavaScript compiler”。那什么是 JavaScript 编译器呢&#xff1f;又…...

Minio搭建并在SpringBoot中使用完成用户头像的上传

Minio使用搭建并上传用户头像到服务器操作,学习笔记 Minio介绍 minio官网 MinIO是一个开源的分布式对象存储服务器&#xff0c;支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发&#xff0c;拥有轻量级、高性能、易部署等特点&#xff0c;并且可以自由…...

Ubuntu系统上部署Node.js项目的完整流程

以下是在Ubuntu系统上部署Node.js项目的完整流程&#xff0c;分为系统初始化、环境配置、项目部署三个部分&#xff1a; 一、系统初始化 & 环境准备 bash # 1. 更新系统软件包 sudo apt update && sudo apt upgrade -y# 2. 安装基础工具 sudo apt install -y buil…...

DeepSeek效应初现:Grok-3补刀ChatGPT,OpenAI已在ICU?

嘿&#xff0c;技术小伙伴们&#xff01;今天咱们聊聊最近在AI界引发轰动的新闻——DeepSeek和xAI相继用R1和Grok-3证明了预训练Scaling Law并非OpenAI的护城河。这意味着什么呢&#xff1f;让我们一探究竟&#xff01; 开场白 首先&#xff0c;让我们看看最新的“全能冠军”…...

【知识】torchrun 与 torch.multiprocessing.spawn 的对比

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 来自ChatGPT、DeepSeek 有点干&#xff0c;可仅做了解。 torchrun 和 torch.multiprocessing.spawn 都是在 PyTorch 中用于并行化和分布式训练的工具&a…...

深入了解 K-Means 聚类算法:原理与应用

引言 在数据科学和机器学习的世界中&#xff0c;聚类是一项非常重要的技术&#xff0c;它帮助我们根据数据的相似性将数据划分为不同的组或簇。聚类算法在许多领域中得到了广泛的应用&#xff0c;如图像处理、市场细分、基因研究等。K-Means 聚类算法作为最常见的无监督学习算…...

Rust ~ Collect

背景 Transforms an iterator into a collection 将一个迭代器转换为一个集合 collect() 可以处理任何可迭代的对象&#xff0c;并将其转换为相关的集合 collect() 最基本模式是将一个集合转换为另一个集合&#xff1a; 先获取一个集合&#xff0c;对其调用 iter 方法&#x…...

C# 类型转换

C# 类型转换 引言 在C#编程语言中&#xff0c;类型转换是一种将一个数据类型的变量转换成另一个数据类型的操作。类型转换是编程中常见的操作&#xff0c;特别是在处理不同数据类型的变量时。本文将详细探讨C#中的类型转换&#xff0c;包括隐式转换和显式转换&#xff0c;以及…...

[IP] DDR_FIFO(DDR3 用户FIFO接口)

IP(DDR_FIFO)将DDR3 IP的用户侧复杂接口修改为简易的FIFO接口&#xff0c;用户侧更加简易例化使用MIG 核 IP介绍 c0_xx (连接DDR app接口) 此IP 仅需根据MIG配置进行有限修改&#xff0c;即可使用&#xff01; 关于IP详细使用说明&#xff0c;参考IP datasheet&#xff01; 示…...

第三百七十二节 JavaFX教程 - JavaFX HTMLEditor

JavaFX教程 - JavaFX HTMLEditor HTMLEditor控件是一个富文本编辑器&#xff0c;具有以下功能。 粗体斜体下划线删除线字体系列字体大小前景色背景颜色缩进项目符号列表编号列表对齐水平线复制文本片段粘贴文本片段 HTMLEditor类返回HTML字符串中的编辑内容。 创建HTML编辑器…...

蓝桥杯试题:DFS回溯

一、题目要求 输入一个数组n&#xff0c;输出1到n的全排列 二、代码展示 import java.util.*;public class ikun {static List<List<Integer>> list new ArrayList<>();public static void main(String[] args) { Scanner sc new Scanner(System.in);…...

Lua | 每日一练 (4)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...