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放进文件夹,点击运行即可。

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

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

相关文章

阿里云物联网获取设备属性api接口:QueryDevicePropertyData

阿里云物联网接口&#xff1a;QueryDevicePropertyData 说明&#xff1a;调用该接口查询指定设备或数字孪生节点&#xff0c;在指定时间段内&#xff0c;单个属性的数据 比如提取上传到物联网的温度数据 api文档&#xff1a;QueryDevicePropertyData_物联网平台_API文档-阿里…

算法系列之动态规划

动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是一种用于解决复杂问题的算法设计技术。它通过将问题分解为更小的子问题&#xff0c;并存储这些子问题的解来避免重复计算&#xff0c;从而提高算法的效率。本文将介绍动态规划的基本概念、适用场景、复…

Linux系列:如何用 C#调用 C方法造成内存泄露

一&#xff1a;背景 1. 讲故事 好久没写文章了&#xff0c;还是来写一点吧&#xff0c;今年准备多写一点 Linux平台上的东西&#xff0c;这篇从 C# 调用 C 这个例子开始。在 windows 平台上&#xff0c;我们常常在 C 代码中用 extern "C" 导出 C风格 的函数&#x…

1.2.3 使用Spring Initializr方式构建Spring Boot项目

本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目&#xff0c;并进行基本配置。首先&#xff0c;通过Spring Initializr生成项目骨架&#xff0c;然后创建控制器HelloController&#xff0c;定义处理GET请求的方法hello&#xff0c;返回HTML字符串。接着&#xf…

【音视频】H265解码Nalu后封装rtp包

概述 基于ZLM流媒体框架以及简单RTSP服务器开源项目分析总结&#xff0c;相关源码参考以下链接 H265-rtp提取Nalu逻辑 通过rtsp流地址我们可以获取视频流中的多个rtp包&#xff0c;其中每个RTP包中又会包含一个或者多个Nalu&#xff0c;将其提取处理 总体逻辑分析 核心逻辑在…

03.03 QT

1.在注册登录的练习里面&#xff0c;追加一个QListwidget 项目列表 要求:点击注册之后&#xff0c;将账号显示到 1istwidget上面去 以及&#xff0c;在listwidget中双击某个账号的时候&#xff0c;将该账号删除 Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWi…

【星云 Orbit • STM32F4】04.一触即发:GPIO 外部中断

【星云 Orbit- • STM32F4】04. 一触即发&#xff1a;外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源&#xff0c;并在中断回调函数中处理按键事件&#xff0c;实现了按键控制LED状态翻转的功能。本文旨…

(新版本onenet)stm32+esp8266/01s mqtt连接onenet上报温湿度和远程控制(含小程序)

物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意&#xff1a;ESP-01sWIFI模块&#xff0c;去搜了一下这个小东西很有玩点&#xff0c;远程控制LED啥的&#xff0c;然后我就想…

并发编程(线程基础)面试题及原理

1. 进程与线程 1.1 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。 当一个程序被运…

基于开源库编写MQTT通讯

目录 1. MQTT是什么&#xff1f;2. 开发交互UI3. 服务器核心代码4. 客户端核心代码5. 消息订阅与发布6. 通讯测试7. MQTT与PLC通讯最后. 核心总结 1. MQTT是什么&#xff1f; MQTT&#xff08;Message Queuing Terlemetry Transport&#xff09;消息队列遥测协议&#xff1b;是…

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…

vscode通过ssh远程连接(linux系统)不能跳转问题

1.问题描述 unbantu中的vscode能够通过函数跳转到函数定义&#xff0c;而windows通过ssh连接unbantu的vscode却无法跳转 2.原因&#xff1a; 主要原因是这里缺少插件&#xff0c;这里是unbantu给主机的服务器&#xff0c;与ubantu本地vscode插件相互独立&#xff0c;能否跳转…

神经网络 - 激活函数(Swish函数、GELU函数)

一、Swish 函数 Swish 函数是一种较新的激活函数&#xff0c;由 Ramachandran 等人在 2017 年提出&#xff0c;其数学表达式通常为 其中 σ(x) 是 Sigmoid 函数&#xff08;Logistic 函数&#xff09;。 如何理解 Swish 函数 自门控特性 Swish 函数可以看作是对输入 x 进行“…

安全运营的“黄金4小时“:如何突破告警疲劳困局

在当今复杂多变的网络安全环境中&#xff0c;安全团队面临着前所未有的挑战。尤其是面对高级持续性威胁&#xff08;APT&#xff09;时&#xff0c;最初的“黄金4小时”成为决定成败的关键窗口。在这段时间内&#xff0c;快速而准确地响应可以极大地降低损失&#xff0c;然而&a…

【Pytest】setup和teardown的四个级别

文章目录 1.setup和teardown简介2.模块级别的 setup 和 teardown3.函数级别的 setup 和 teardown4.方法级别的 setup 和 teardown5.类级别的 setup 和 teardown 1.setup和teardown简介 在 pytest 中&#xff0c;setup 和 teardown 用于在测试用例执行前后执行一些准备和清理操…

傅里叶分析

傅里叶分析之掐死教程&#xff08;完整版&#xff09;更新于2014.06.06 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具&#xff0c;更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是&#xff0c;傅里叶分析的公式看起来太复…

matlab 四维数据可视化(已解决)

虽然这不是传统意义上的“4维可视化”&#xff0c;但你可以通过在三维空间中表示两个维度来间接展示4维数据。例如&#xff0c;你可以使用颜色来表示第四个维度。 clc clear close all% 假设X, Y, Z为你的三维数据&#xff0c;C为第四维数据 X rand(100, 1); Y rand(100, 1);…

MAC 本地搭建部署 dify(含 github访问超时+Docker镜像源拉取超时解决方案)

目录 一、什么是 dify&#xff1f; 二、安装 docker 1. 什么是 docker&#xff1f; 2. docker下载地址 三、安装 dify 1. dify下载地址 2.可能遇到问题一&#xff1a; github访问超时 3.下载后完成解压 4.进入到 cmd 终端环境&#xff0c;执行下面三个命令 5.可能遇到…

rustup-init.exe 安装缓慢的解决办法

首先在rust官网下载安装程序&#xff0c;官网下载的 rustup-init.exe 下载慢&#xff0c;安装慢&#xff0c;或者直接卡死。 下载安装程序在本地&#xff0c;使用国内镜像加速 Rust 更新与下载。 使用国内镜像源&#xff1a;在 rustup-init.exe 程序文件夹下使用 PowerShell 中…

OpenAI发布GPT-4.5:功能非常特殊,推理很贵

今天凌晨4点&#xff0c;OpenAI进行了在线技术直播&#xff0c;发布了最新模型GPT-4.5。 GPT-4.5与之前的模型相比&#xff0c;本次最大的亮点是加上了“情商”&#xff0c;这也是目前所有大模型最缺、最难的功能。 此外&#xff0c;GPT-4.5 在SimpleQA上的测试数据显示&…